“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,但除了保持可读性之外,我尽量避免使用它

考虑以下两个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,但除了保持可读性之外,我尽量避免使用它

我想做这样的事情

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();