同じタイプ(特定のタイプのセットのいずれかである可能性があるタイプ)の2つの値のペアを表すクラスがあります。
public class Pair<E extends AClass>{
private E var1;
private E var2;
}
このクラスはフレームワークによって使用されるため、2つの変数(var1、var2)をインスタンス化する必要がある引数のないコンストラクターが必要です。
public class Pair<E extends AClass>{
private E var1;
private E var2;
public Pair(){
var1 = invoke constructor of type E;
var2 = invoke constructor of type E
}
}
ここには明らかに多くの問題があります。
変数をインスタンス化するには、どういうわけかその正確な型を知り、その特定の型のコンストラクターを呼び出す必要があります。最良の場合、これはコンストラクターにかなり大きなifelseステートメントがあることを意味します。
public Pair(){ if(var1 instanceof SpecificType1){ var1 = new SpecificType1(); var2 = new SpecificType2(); } }
上記のように行っても、var1がタイプEで宣言されているため、いくつかの問題が発生します。SpecficType1をインスタンス化して、結果のオブジェクトをvar1 / var2に割り当てようとすると、タイプの不一致エラーが発生します。それを機能させるために、私はEにキャストする必要があります:
var1 = (E)new SpecificType1();
しかし、特定の型をジェネリック型にキャストしようとしているので、これはコンパイル時の型チェックを破壊します。
これはJavaのジェネリックスの制限ですか、それともこのシナリオはジェネリックスを使用するのに悪いシナリオですか?