Java Iterator<E>,类型 E 的继承

标签 java inheritance iterator

我发现了一些对我来说很有趣的东西。考虑以下代码:

// 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
}

我的问题是:

  1. 是否在某处记录了此行为?
  2. 此行为是否正确/有意为之?

最佳答案

是的,这在某处有记录,即在 the Java Tutorial about generics 中.也是有意的。

如果BA 的子类型, 那么 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/

相关文章:

c++ - 将 const_iterator 复制到 std::string 以保存位置

java - Spring Boot应用程序无法启动嵌入式容器

Python:如何引用成员变量

javascript - 继承 React 组件的正确方式

c++ - 无法访问模板基类中的变量

iterator - Java 8 迭代器流到迭代器会导致对 hasNext() 的冗余调用

java - 如何以干净的方式检索短信对话

java - 将列表信息传递给新 Activity

java - 域类应该知道如何将自身序列化为 JSON 表示形式吗?

ruby-on-rails - Ruby 部分检索大量记录并迭代它们