1

Javaジェネリックを使用して、次のような型階層を表現する方法はありますか?

class A { ... }

class B extends A { ... }

interface Wraps<T> {
  T getWrapped();
}

class WrapsA implements Wraps<A> {
  A getWrapped();
}

class WrapsB extends WrapsA /* implements Wraps<B> */ {
  B getWrapped();
}

書かれているように、Java の型システムがこのコードを拒否することは理解していますが、これを機能させる型パラメーターまたは継承階層を指定する方法はありますか?

編集: 私が抱えている本当の問題は、次のようなメソッドの API で型の安全性を強制しようとしていることに気付きました

<T extends A> T unwrap(Wraps<T> wrapper, Class<T> wrappedClass);

で呼び出すことができませんunwrap(wrapsB, B.class)。これはJavaが処理するものですか?

4

2 に答える 2

2

あなたはただ使うことができます

class WrapsB extends WrapsA {
    B getWrapped();
}

オーバーライドされたメソッドでサブクラスを返すことが許可されているため(私が覚えている限り、Java SE6から可能です)

于 2013-10-17T17:09:45.073 に答える