“Java接口”;别名";
考虑以下两个Java文件,它们包含我的问题的简化版本“Java接口”;别名";,java,interface,types,Java,Interface,Types,考虑以下两个Java文件,它们包含我的问题的简化版本 #a.java package a; public interface I { //... } #b.java package b; public interface I { //... (different stuff from a.I) } 您会注意到在我的项目中有两个名为“I”的接口。这是无法改变的。 我需要在一个类中同时使用这两种类型。当然,我可以将它们的每一种类型都引用为a.I和b.I,但除了保持可读性之外,我尽量避免使用它
#a.java
package a;
public interface I {
//...
}
#b.java
package b;
public interface I {
//... (different stuff from a.I)
}
您会注意到在我的项目中有两个名为“I”的接口。这是无法改变的。
我需要在一个类中同时使用这两种类型。当然,我可以将它们的每一种类型都引用为a.I和b.I,但除了保持可读性之外,我尽量避免使用它
我想做这样的事情
interface B extends b.I {
}
这可以让我通过使用B和a来使用I的接口,就像导入I一样。问题是这不起作用,让我们使用
interface MyList extends List<String> {
}
MyList l = new ArrayList<String>();
接口MyList扩展列表{
}
MyList l=新的ArrayList();
这会产生一个类型错误。为什么Java“不知道”MyList扩展了列表
另外,我在上面的示例中尝试了强制转换,但它生成了一个ClassCastException
想法?Java确实知道
MyList
扩展了List
,但它也非常清楚ArrayList
没有实现MyList
。我强烈建议以最简单、最清晰、最清晰、最可读的方式消除歧义:使用a.I
和b.I
这是有效的:
List<String> list = new MyList();
显然,
ArrayList
没有foo()
方法。您不能将ArrayList
强制转换为MyList
,因为MyList
不是ArrayList
的超类或超接口。假设您实际向MyList
添加了一个方法,比如说MyList.swizzle()
。如果Java允许强制转换,然后调用l.swizzle()
,会发生什么
我认为您不会找到一个令人满意的解决方案,因为Java没有importas
类型重命名语句。但是在Java1.5中,实现一个接口来将其成员添加到类的名称空间是禁止的:如果您打算这样做,请尝试一下。这是现在人们喜欢用的成语,用来形容你正在做的事情
MyList l = new ArrayList<String>();
public interface MyList extends List<String> {
void foo();
}
MyList l = new ArrayList<String>();
l.foo();