タイプがワイルドカードの場合、ジェネリック結果をジェネリックパラメーターとして使用するにはどうすればよいですか?

クリス・コンウェイ:

[更新]実際の状況は、最初の質問のように思えたよりも少し複雑でした。それを反映するようにコードを少し変更しました。[/ UPDATE]

私は次の行動に少し困惑しています。次のようなコードがあるとします。

interface Inter<T> {
  T makeT();
  void useT(T t);
}

public class Foo {
  public void bar(Qux q) {
    Inter<?> x = getInterForQux(q);
    x.useT(x.makeT());
  }

  Inter<?> getInterForQux(Qux q) {
    if( someTest(q) ) {
      return (Inter<Integer>) mkAnInterInt();
    } else {
      return (Inter<Double>) mkAnInterDouble();
    }
  }
}

Javacは私にエラーを与えます:

Inter <capture#478 of?>のuseT(capture#478 of?)は(java.lang.Object)に適用できません

Eclipseが私に与えるのに対して:

型Inter <capture#1-of?>のメソッドuseT(capture#1-of?)は、引数(capture#2-of?)には適用できません。

明らかに、T結果の型が何であっても、makeT()のパラメーターの型と同じですuseT()なぜこれができないのですか?回避策はありますか?

axtavt:

ワイルドカードを使用すると、コンパイラはの戻り値の型x.makeT()とパラメータの型x.useT()が同じであることを認識できませんそれらが同じであることを保証するには、ここでジェネリックメソッドを使用する必要があります。

public class Foo { 
    public <T> void bar(Inter<T> x) { 
        x.useT(x.makeT()); 
    } 
} 

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ