我正在读一本关于Java数据结构的书,现在正在谈论迭代器。我看到了以下代码,这对我来说似乎很奇怪。在以下代码中,AbstractIterator是实现Iterator<E>的抽象类,UniqueFilterAbstractIterator的子类,该子类不是抽象的,而data是Vector。我想我不明白在第一行中如何获取Vector.iterator()方法的输出并将其转换为抽象类。在第1行之后,dataIterator是否不是抽象类的实例化实例?

AbstractIterator<String> dataIterator =
    (AbstractIterator<String>)data.iterator();
AbstractIterator<String> ui = new UniqueFilter(dataIterator);

最佳答案

问题在于我们正在谈论两种不同的类型。对象的(运行时)类型和引用的(编译时)类型。

  • dataIterator是抽象类型的引用-可以。
  • data.iterator()返回对对象的引用,该对象的类型在示例中不清楚,但显然是从AbstractIterator<String>继承的具体类型-okt
  • 即使B是A的子代,即使A是抽象的(或接口),也始终可以将对B类型的对象的引用分配给对A类型的对象的引用。您实际上不需要演员表。

  • 因此,在第一行之后,dataIterator仍然是AbstractIterator<String>类型的引用,但这是对实现AbstractIterator<String>的具体类型的对象的引用。

    请记住,在JAVA中,所有对象变量实际上都是引用。
    UniqueFilter与这个问题无关,顺便说一句。

    09-26 06:25