Java界面"别名"

Mik*_*ike 0 java types interface

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

#a.java
package a;
public interface I {
 //...
}

#b.java
package b;
public interface I {
 //... (different stuff from a.I)
}
Run Code Online (Sandbox Code Playgroud)

您会注意到我的项目中有两个名为"I"的接口.这不能改变.我处于一种需要在单个类中使用这两种类型的情况.当然,我当然可以将它们的每个类型作为aI和bI引用,但我试图除了保持可读性之外什么也不做.

我想做这样的事情

interface B extends b.I {

}
Run Code Online (Sandbox Code Playgroud)

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

interface MyList extends List<String> {
}

MyList l = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

这会产生类型错误.为什么Java"不知道"MyList扩展了List?

另外,我在上面的例子中尝试过转换,但是它会生成一个ClassCastException

思考?

cle*_*tus 6

这是有效的:

List<String> list = new MyList();
Run Code Online (Sandbox Code Playgroud)

这不是:

MyList l = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

ArrayList不是MyList.他们只是有一个共同的超级接口.这就是为什么它不起作用.Java"知道" MyList是一个,List但这并不意味着你可以分配List给它.

考虑:

public interface MyList extends List<String> {
  void foo();
}

MyList l = new ArrayList<String>();
l.foo();
Run Code Online (Sandbox Code Playgroud)

显然ArrayList没有这个foo()方法.