私はあなたの問題を本当に理解していません。これはあなたが探しているものですか?
class MyClass {
protected static <T> Set<T> SetFactory(int size)
{
return new HashSet<T>(size);
}
protected static <K, V> Map<K, Set<V>> mapFactory(Collection<K> keys)
{
Map<K, Set<V>> result = new HashMap<K, Set<V>>(keys.size());
for (K key : keys)
result.put(key, MyClass.<V>SetFactory(20));
return result;
}
}
<V>
ジェネリック メソッド呼び出しの明示的な型パラメーター ( ) に注意してください。
アップデート:
私はおそらく間違っていますが、キャストがないと言うのはセマンティクスのように思えます-MyClassを配置する必要があります。前にキャストする必要があるようです。違いを説明できますか?
型の消去では、関数(Set<V>) SetFactory(20)
の結果の実行時の型が型であることを確認する方法がないため、型の安全性に関するコンパイラの警告が生成されます。SetFactory
V
メソッド呼び出しで型パラメーターを使用することは、 と言うのとよく似ていnew HashSet<V>()
ます。ジェネリック クラスのコンストラクターを呼び出すときは、コンストラクターの型引数を指定する必要があります。ジェネリック メソッドを呼び出すときは常に、型パラメーターを指定する必要があります。多くの場合、これらはメソッドの結果の割り当てまたはメソッドのパラメーターから推測できますが、常にそうとは限りません。
ただし、キャストではありません。キャストは常に実行時に型チェックを実行します。ここに示すようにジェネリック型を指定すると、コンパイル時に機能します。