2011-09-09 26 views
1

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; 
     } 
+0

私が言う限りでは、どちらもうまくいくはずです。 :-) – corsiKa

+0

「A」に汎用引数が適切に供給されることはありません。彼はどこにでもワイルドカードを持っています。 –

+0

Edit2は良いコードではありません。理由は次のとおりです。シナリオは3つあります。ケース1 - 'createAHashtable'へのすべての呼び出し側は' A 'と' A 'の値を扱うことができます。これは、インダイレクションを追加しなくてもJavaでモデル化するのは難しいです。ケース2 - すべての発信者は 'A 'を処理できます。もしそうなら、APIは 'Hashtable >'を返すべきです。ケース3 - 呼び出し元が 'A '以外のものを期待し、実行時にクラスキャスト例外で死ぬ。 –

答えて

5

これを試してみてください:

public <T extends Number> Hashtable<String, A<T>> createAHashtable() { 
    return new Hashtable<String, A<T>>(); 
} 

は、あなたがしようと、キーと値のペアで予め埋めたかったと言う:

2を編集する関連
public <T extends Number> Hashtable<String, A<T>> createAHashtableWithEntry(String key, T value) { 
    Hashtable<String, A<T>> ht = return new Hashtable<String, A<T>>(); 
    ht.put(key, new A<T>(value)); 
    return ht; 
} 
+0

は、Float AをHashtableに追加できません。私の編集をご覧ください。 – 5YrsLaterDBA

+0

'A 'は必ずしも 'A 'とは限りません。だからあなたはそれを追加することはできません。 –

+0

... 'createAHashtableWithEntry'を含む編集を参照してください –

0

このケースが安全でない理由の具体的な例を次に示します。私のIDEでは、キャストが安全でないという警告を実際には受け取っていません。

import java.util.ArrayList; 
import java.util.List; 

public class Genericss { 

    static <T extends Number> List<A<T>> get2() { 
     List<A<T>> list = new ArrayList<A<T>>(); 
     A<Float> f = new A<Float>(3.0f); 
     list.add((A<T>) f); // Compiles... not even a warning on my IDE 
     return list; 
    } 

    public static void main(String[] args) { 
     List<A<Integer>> l = Genericss.<Integer>get2(); 
     Integer i = l.get(0).get(); // runtime error 

     A<Float> f = new A<Float>(3f); 
     //i = (A<Integer>) f; // won't compile 
    } 

    public static class A<T> { 
     T t; 

     public A(T t) { 
     this.t = t; 
     } 

     public T get() { 
     return t; 
     } 
    } 
} 
関連する問題