首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java接口"Alias“

Java接口"Alias“
EN

Stack Overflow用户
提问于 2009-08-31 02:54:32
回答 3查看 1.5K关注 0票数 0

考虑以下两个Java文件,它们包含我的问题的简化版本

代码语言:javascript
复制
#a.java
package a;
public interface I {
 //...
}

#b.java
package b;
public interface I {
 //... (different stuff from a.I)
}

您会注意到,在我的项目中有两个名为"I“的接口。这是不能更改的。我所处的情况是,我需要在单个类中使用这两种类型。当然,现在我可以将它们的每个类型都引用为a.I和b.I,但除了保持可读性之外,我尽量避免这样做。

我想做这样的事情

代码语言:javascript
复制
interface B extends b.I {

}

这可以让我通过使用B和来使用I的接口,而通过导入来使用a.I作为I。问题是这不起作用,让我们以这个具体的例子为例,使用

代码语言:javascript
复制
interface MyList extends List<String> {
}

MyList l = new ArrayList<String>();

这会产生类型错误。为什么Java不“知道”MyList扩展列表?

另外,我在上面的示例中尝试了强制转换,但它生成了一个ClassCastException

有什么想法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-31 02:57:14

这是有效的:

代码语言:javascript
复制
List<String> list = new MyList();

这不是:

代码语言:javascript
复制
MyList l = new ArrayList<String>();

ArrayList不是MyList。它们只有一个通用的超级界面。这就是它不起作用的原因。Java“知道”MyList是一个List,但这并不意味着你可以给它分配一个List

考虑一下:

代码语言:javascript
复制
public interface MyList extends List<String> {
  void foo();
}

MyList l = new ArrayList<String>();
l.foo();

显然,ArrayList没有foo()方法。

票数 6
EN

Stack Overflow用户

发布于 2009-08-31 02:56:58

Java知道MyList扩展了List<String>,但它也很清楚ArrayList<String>不实现MyList。我强烈建议用最简单、最清晰、最干净、最易读的方式来消除歧义:使用a.Ib.I

票数 1
EN

Stack Overflow用户

发布于 2009-08-31 02:57:51

您不能将ArrayList<String>转换为MyList,因为MyList不是ArrayList<String>的超类或超接口。假设您实际上向MyList添加了一个方法,比如MyList.swizzle()。如果Java允许强制转换,然后调用l.swizzle(),会发生什么?

我不认为你会找到一个令人满意的解决方案,因为Java没有import as类型重命名语句。但是在Java1.5中,禁止实现一个接口来将其成员添加到类的名称空间中:如果您打算沿着这条路线走下去,请尝试一下static import。这是当今最受欢迎的成语,用来描述你正在尝试做的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1355617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档