3

私は理解できない愚かな問題で立ち往生しています。

class Foo<T extends Collection<E>, E> {
  private Class<T> collectionClass;
  private Class<E> elementClass;

  public Foo(Class<T> collectionClass, Class<E> elementClass) {
       this.collectionClass = collectionClass;
       this.elementClass = elementClass;
  }
} 

これを実行しようとすると

Foo<Collection<String>, String> foo = 
    new Foo<Collection<String>, String>(
        Collection.class,
        String.class);

コンパイラエラーが発生します

java.lang.Error: Unresolved compilation problem: 
The constructor Foo<Collection<String>,String>(Class<Collection>, Class<String>) is undefined

なんで ?ジェネリックを消去すれば大丈夫です

Foo foo = 
    new Foo(
        Collection.class,
        String.class);

誰かがアイデアを持っているなら、それは素晴らしいことであり、壁に頭をぶつけるのを止めてくれます。

4

5 に答える 5

4

のようなものはありませんCollection<String>.class、問題です。あなたの選択肢は次のとおりです

  • リフレクションを使用しないでください。なぜリフレクションを使用しているのですか?
  • 安全でないキャストの必要性を受け入れる
  • Guavaのような、実行時にジェネリック型を参照するためのさまざまなツールの1つを使用します。TypeToken
于 2012-12-16T23:59:16.220 に答える
1

あなたがそれについてできることはあまりありません。ただそれの周りにキャスト

new Foo<Collection<String>, String>(
    (Class<Collection<String>>)(Class<?>)Collection.class,
    String.class);
于 2012-12-17T02:05:27.640 に答える
0

型消去のため、運が悪いので、この質問を参照してください。

ただし、生のコレクションクラスと要素クラスを使用して、タイプセーフなCollection<String>オブジェクトを生成できます。したがって、コレクションとして、コレクション内のEの冗長性を削除します。

于 2012-12-17T00:06:35.953 に答える
0

ユースケースでは、コンストラクターのパラメーター型を緩和できる可能性があります

public Foo(Class<?> collectionClass, Class<E> elementClass) 
{
    this.collectionClass = (Class<T>)collectionClass;
    this.elementClass = elementClass;
}

Foo<Collection<String>, String> foo = new Foo<>(Collection.class, String.class);

タイプチェックが少ないため、ユーザーは、次のように、間違ったクラスが渡されないようにする必要があります。

Foo<Set<String>, String> foo = new Foo<>(List.class, String.class);
    ^^^                                  ^^^^
于 2012-12-17T00:06:47.023 に答える
0

Ok、

私は他の人々の答えを見てきましたが、これが得意ではありません...

Oreilly Tigerの本(バージョン5用)(p167)では、コンストラクターが署名にワイルドカードを含めることはできないという非常に明確なステートメントを作成しています...

于 2012-12-17T00:19:13.047 に答える