Andyは問題を解決する方法を説明しました。理由を説明しようとします。
S
はMyAbs
に割り当てられることは保証されておらず、AbsClass
にのみ割り当てられ、各インスタンスはAbsClass
のサブクラスを指定します。
は考えてみましょう:
class MyOtherAbs extends AbsClass {}
MyClass myClass = new MyClass<MyOtherAbsClass>{};
これはあなたが持っているものと競合します。
UPDATE:あなたのコメントに基づいて
あなたは上記を達成したいように見えます。問題は、MyOtherAbs
に引数を持つコンストラクタがある場合はどうなりますか?あるいは、シングルトン(すなわち、プライベートコンストラクタとスタティックgetInstance()
)として実装されています。一言で言えば、これらを構築するための統一された統一方法はありません。さらに、実行時に、消去を入力に起因するが、Sの概念がなくなっているので、あなたのような何かをすることはできません。
public interface AbsClassFactory<S extends AbsClass>{ //takes the place of MyClass
public S getInstance();
}
MyAbsFactory implements AbsClassFactory<MyAbs>{
public MyAbs getInstance(){
return new MyAbs(); //or however MyAbs is instantiated
}
}
:あなたは基本的に2つの選択肢を持っている
return new S();
を、一つはサブクラス化を使用することです第二は、可能な引数なしのコンストラクタがあると仮定し、1でない場合は、ランタイム例外をスローすることを
class MyClass {
public <S extends AbsClass> S getObj(Class<S> clazz) throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
}
}
注:他のオプションが反映しています。
''
を削除し、 'MyAbs getObj(どちらかに' S getObjを() 'に変更) 'または' AbsClass getObj() 'を呼び出します。それがそのままで、型変数を持つ理由はありません。 –「これをする」と言ったときに何を言いたいのですか? – Simon
私はMyClassを初期化できることを望んでいたので、getObj()を呼び出すとMyAbsオブジェクトが返されます。アンディの答えでは、AbsClassをMyAbsやMySecondAbsにキャストしなければならなかったでしょう。 –
mwong56