Map<String, Integer> instance = new TreeMap<String, Integer>();
@SuppressWarnings("unchecked")
Map<String, Integer> map =
createMap((Class<? extends Map<String, Integer>>)instance.getClass());
map.put("x", 1);
System.out.println("THIS IS x: " + map.get("x"));
これは、適切に1からメソッドの実装を出力しますが、それらは、タイプにT
をお聞きする彼らのAPIのより高度な実装は次のようになり
try
{
return clazz.newInstance();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
可能性が最も高い、とのために彼らはあなたにすべての詳細を尋ねるのではなく、Map
を返すようにしました。そうでなければ、限り、彼らは任意のデータでMap
に充填されていないとして、あなたはそうのようなジェネリック型引数を自分でMap
をインスタンス化することができます
public static <T> Map<String, T> getMap()
{
return new TreeMap<String, T>();
}
をあなたはその後、警告なしということでアクセスできます。
// note the lack of type arguments, which are inferred
Map<String, Integer> instance = getMap();
// alternatively, you could do it more explicitly:
// Map<String, Integer> instance = ClassName.<Integer>getMap();
実装に正確に一致し、あなたをお返しする場合を除き、それらはあなたのMap
のClass
タイプのためにあなたを依頼するための理由は、あなたがHashMap
に固執する場合(例えば、あなたはHashMap
を取り戻す、とあればなり本当にありませんあなたはにこだわるを入力すると、TreeMap
が返されます)。しかし、TreeMap
は、それが構築されたComparator
を失い、それはのフィールドが不変(final
)なので修正できないと思われます。つまり、その場合はMap
が同じではなく、あなたが望むものではない可能性があります。
データでMap
を入力すると、意味がなくなります。 Map
のインスタンスを渡すこともできますし、Map
を返すようにすることもできます(たとえばnew TreeMap<String, Integer>(instance);
)。データに最も多くのユーティリティを提供するのはMap
です。
タイプの消去が原因ではありません。特に、メソッドのシグネチャは、値パラメータを 'T'として' Map'の 'Class'を取り込んでいても' T'を出そうとしているので意味がありません。オブジェクトの既存のインスタンスがなければ、ネストされた型を取得することはできません。 (あなたは '(新しいHashMap())。getClass()'を渡すことができますが、そのメソッドから 'Integer'を取り戻すことはできません)。 –
pickypg
createMap()は、使用するライブラリのものです。そのメソッドを呼び出す方法が必要です。 –
私は返されたオブジェクトの合法性に疑問を呈します。これは 'Map'の' Class'に渡されるとき、値パラメータのインスタンス 'T'を返すと思われ、メソッド名は' createMap'です。それのどれも意味をなさない。 – pickypg