我知道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应该明确定义的语义-我想通过允许两种类型而不是一种类型的交集,不会丢失类型安全性。我敢肯定有一个解释。有谁知道它是什么?