支持通用迭代中的接口和类

时间:2014-12-18 18:49:49

标签: java generics

我试图编写一个可迭代的接口并支持多级抽象。我无法正确定义界面。

我宣布了以下接口和类(玩具示例):

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,以便我可以支持两种迭代方案,或者这是不可能的?谢谢!

1 个答案:

答案 0 :(得分:5)

当您将新C分配给D时,您正在使用c界面的原始格式。使用接口的原始形式强制对接口中的所有内容进行类型擦除,这意味着foreach循环中返回的Iterator返回Object s,而不是B s。

但是C接受一个必须仍然提供的类型参数,即使D本身不是通用的。尝试

C<B> c = new D();