1

いくつかの異なる s に対して、Maps からKs までの sを持つクラスがあります。一般的なファクトリ ala を使用したい:Set<V>V

protected static <T> Set<T> SetFactory(int size) {
        return new HashSet<T>(size);
}

のようなことをする

for (K key : keySet) map.put(key, SetFactory());

とのように、ジェネリック部分が機能します(コンパイルエラーが発生し、Set<Object>との間の型が一致Set<V>しません)Set<V> x = SetFactory();

Class<V>に引数を渡す代わりの方法はありSetFactory()ますか?

4

5 に答える 5

2

私はあなたの問題を本当に理解していません。これはあなたが探しているものですか?

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)の結果の実行時の型が型であることを確認する方法がないため、型の安全性に関するコンパイラの警告が生成されます。SetFactoryV

メソッド呼び出しで型パラメーターを使用することは、 と言うのとよく似ていnew HashSet<V>()ます。ジェネリック クラスのコンストラクターを呼び出すときは、コンストラクターの型引数を指定する必要があります。ジェネリック メソッドを呼び出すときは常に、型パラメーターを指定する必要があります。多くの場合、これらはメソッドの結果の割り当てまたはメソッドのパラメーターから推測できますが、常にそうとは限りません。

ただし、キャストではありません。キャストは常に実行時に型チェックを実行します。ここに示すようにジェネリック型を指定すると、コンパイル時に機能します。

于 2009-09-21T19:24:07.817 に答える
0

明示的な割り当てが必要です。

for (K key : keySet) {
  Set<V> mySet = setFactory(20);
  map.put(key, mySet);
}

それがなければ、コンパイラが次のタイプを知る方法はありません。<V>

于 2009-09-21T18:40:02.460 に答える
0

絶対に 1 行に収める必要がある場合は、put にバロニー代入を入れることができます。

 Set<V> s = null;
 for (K key : keySet) map.put(key, s = setFactory());

しかし、その答えは、それを行う別の方法を示すためのものであり、実際にそれがより良い方法であることを示唆するものではありません.

于 2009-09-21T18:48:26.863 に答える
0

うーん、実際にはこれはうまくいくようです:

protected static <K,V> Map<K,Set<V>> mapFactory(Collection<K> keys) {
    Set<V> holder;
    Map<K,Set<V>> result = new HashMap<K,Set<V>>(keys.size());
    for (K key : keys) result.put(key, holder = SetFactory());
    return result;
}

また、最初にマップを割り当てなければならないという煩わしさからも解放されます。実際にクラスをオーバーライドできるようにするには、引数リストにファクトリを追加する必要があると思います。

于 2009-09-21T18:48:30.047 に答える
0

Apache Commons Collectionsは、マップの値を作成するFactoryオブジェクトを提供するLazyMapを提供します。Set 値を作成する Factory を指定できます。

現在、Commons Collections はジェネリックを使用していませんが、ここにジェネリック ポートがあります

あなたの質問を正しく解釈したことを願っています - それはかなり混乱していました.

于 2009-09-21T18:43:40.923 に答える