我发现了一些对我来说很有趣的东西。考虑以下代码:
// file: example.java
interface Interface1
{
Iterator<Interface2> getIterator();
}
interface Interface2
{
}
interface Interface3 extends Interface2
{
}
class Class1 implements Interface1
{
Iterator<Interface3> getIterator(); // Compiler throws error: type mismatch
}
我的问题是:
- 是否在某处记录了此行为?
- 此行为是否正确/有意为之?
最佳答案
是的,这在某处有记录,即在 the Java Tutorial about generics 中.也是有意的。
如果B
是 A
的子类型, 那么 SomeClass<B>
就不是这样了是 SomeClass<A>
的子类型.其原因如下。假设以下代码可以编译:
public static void main(String[] args)
{
ArrayList<B> list = new ArrayList<>();
// if ArrayList<B> would be a subtype of ArrayList<A>
// this would be legal:
ArrayList<A> list2 = list;
A element = new A();
list2.add(element);
// Uh-oh. Now list contains non-B elements.
B b = list.get(0); // <--- ClassCastException
}
然后可以绕过类型参数并将非 B 对象添加到 B 的列表中。为了解决这个问题,Java 提供了绑定(bind)类型变量:类型变量可以通过 extends
上下绑定(bind)。和 super
关键字。有关如何使用它们的信息,请参阅 Java Turorial。
关于Java Iterator<E>,类型 E 的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26888666/