Javaのジェネリックプログラミング:別のクラスではは、私はこのようなクラスA持って質問
public class A<T extends Number>
{
....
}
私はこの方法を持っています。 ....
public Hashtable<String, A <? extends Number>> createAHashtable()
{
Hashtable<String, A<? extends Number> hTable = new Hashtable<String, A<? extends Number>();
return hTable;
}
か???:だから私はこれを行う必要があります。
public Hashtable<String, A <?>> createAHashtable()
{
Hashtable<String, A<?>> hTable = new Hashtable<String, A<?>>();
return hTable;
}
するか、これを行います
EDIT:
は、この(Dilumにより示唆されるように)
public <T extends Number> Hashtable<String, A<T>> createAHashtable()
{
Hashtable<String, A<T>> hTable =
new Hashtable<String, A<T>>();
A<Float> constraint = new A<Float>();
hTable.put("test", constraint);
return hTable;
}
を試みたが、たぶんワイルドカードへの道である私のフロートA.を "置く" こと
無効です。行く。
EDIT 2:Dilumの提案に基づいて
、次のコード(ハッシュテーブルにフロートAを入れたときにAにキャスト)は誤りがないが、それを警告することは危険なキャストです。なぜキャストが必要なの?
public <T extends Number> Hashtable<String, A<T>> createAHashtable()
{
Hashtable<String, A<T>> hTable =
new Hashtable<String, A<T>>();
A<Float> constraint = new A<Float>();
hTable.put("test", (A<T>)constraint);
return hTable;
}
私が言う限りでは、どちらもうまくいくはずです。 :-) – corsiKa
「A」に汎用引数が適切に供給されることはありません。彼はどこにでもワイルドカードを持っています。 –
Edit2は良いコードではありません。理由は次のとおりです。シナリオは3つあります。ケース1 - 'createAHashtable'へのすべての呼び出し側は' A 'と' A 'の値を扱うことができます。これは、インダイレクションを追加しなくてもJavaでモデル化するのは難しいです。ケース2 - すべての発信者は 'A 'を処理できます。もしそうなら、APIは 'Hashtable >'を返すべきです。ケース3 - 呼び出し元が 'A '以外のものを期待し、実行時にクラスキャスト例外で死ぬ。 –