2

さて、実装に内部クラスがあるパラメトリック インターフェイスがあります。それ自体はパラメーター化されておらず、暗黙的にのみ外側のクラスの型パラメーターを使用するため、内部クラスの完全な (ジェネリック) 型を参照することはできないようです。

public interface TestA<R> {
   public Class<? extends R> getTheRClass();
}

public class TestB<Z> implements TestA<TestB<Z>.InnerStuff> {

   public class InnerStuff {
       List<R> iCantBeStatic;
   }

   InnerStuff myStuff;

   @Override
   public Class<? extends TestB<Z>.InnerStuff> getTheRClass() {
      // return InnerStuff.class;
      // return myStuff.getClass();
      // return TestB.InnerStuff.class;
      // return TestB<Z>.InnerStuff.class;
      throw new AngryProgrammerException();
   }
}

問題のクラスを返し、コンパイラに正しい型を認識させる方法はありますか?? はい、問題を回避する 1,001 の方法があることを知っています (内部クラスを静的にする、内部クラスがないようにリファクタリングするなど) そのオーバーライドで機能する式があるかどうかを知りたい、またはそのような表現が存在しない場合...

4

1 に答える 1

2

消去により、Class返される実際のインスタンスは内部的にはTestB.InnerStuff.class;になります。パーツは<Z>実行時に実際には存在しません。だからあなたの本能return TestB.InnerStuff.classはお金にありました。それを機能させるには、生の型Classにキャストを追加して、コンパイラが鳴らないようにするだけです。

return (Class)TestB.InnerStuff.class;

@SuppressWarnings({ "unchecked", "rawtypes" })(その後、このような警告メッセージが不要であることをコンパイラに伝えるような注釈を追加できます。)

于 2012-11-26T20:07:29.207 に答える