为什么不能在有界通配符泛型中拥有多个接口?
我知道Java的泛型类型有各种各样的反直觉属性。这里有一个特别我不明白的,我希望有人能向我解释。为类或接口指定类型参数时,可以对其进行绑定,以便它必须使用 实现多个接口。但是,如果您正在实例化实际对象,则不再起作用。 很好,但无法编译。请考虑以下完整代码段:public class Foo<T extends InterfaceA & InterfaceB>
List<? extends InterfaceA>
List<? extends InterfaceA & InterfaceB>
import java.util.List;
public class Test {
static interface A {
public int getSomething();
}
static interface B {
public int getSomethingElse();
}
static class AandB implements A, B {
public int getSomething() { return 1; }
public int getSomethingElse() { return 2; }
}
// Notice the multiple bounds here. This works.
static class AandBList<T extends A & B> {
List<T> list;
public List<T> getList() { return list; }
}
public static void main(String [] args) {
AandBList<AandB> foo = new AandBList<AandB>(); // This works fine!
foo.getList().add(new AandB());
List<? extends A> bar = new LinkedList<AandB>(); // This is fine too
// This last one fails to compile!
List<? extends A & B> foobar = new LinkedList<AandB>();
}
}
似乎应该很好地定义语义 - 我想不出允许两种类型的交集而不仅仅是一种类型的交集来失去类型安全性。我相信有一个解释。有人知道它是什么吗?bar