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
明確に定義されている必要があるようです。1 つの型だけでなく 2 つの型の共通部分を許可することで、型の安全性が失われるとは考えられません。確かに説明はあるけど。誰がそれが何であるか知っていますか?