我试图编写一个可迭代的接口并支持多级抽象。我无法正确定义界面。
我宣布了以下接口和类(玩具示例):
public interface A {}
public class B implements A {}
public interface C <T extends A> extends Iterable<T> {}
public class D implements C<B> {
public Iterator<B> iterator() { ... }
}
以下作品:
D d = new D();
for (A a : d) {}
for (B b : d) {}
但以下内容无法编译。 Java说for-each循环变量应该是Object类型。
C c = new D();
for (B b : c) {}
我知道我可以在第二个例子中强制安抚编译器,但这看起来很令人讨厌。有没有办法声明接口C和子类D,以便我可以支持两种迭代方案,或者这是不可能的?谢谢!
答案 0 :(得分:5)
当您将新C
分配给D
时,您正在使用c
界面的原始格式。使用接口的原始形式强制对接口中的所有内容进行类型擦除,这意味着foreach循环中返回的Iterator
返回Object
s,而不是B
s。
但是C
接受一个必须仍然提供的类型参数,即使D
本身不是通用的。尝试
C<B> c = new D();