ラッパーのファクトリ メソッドを作成しようとしていますが、ジェネリック型につまずいています。
私は 2 つのクラス A と B を持っており、B は A から派生しています。次に、A と B の Wrappber 基本クラス (WBase) とラッパー クラス WA と WB を持っています。
以下のコードをコンパイルすると、
型の安全性: 型 Test のジェネリック メソッド wrap(Class, T) の未チェックの呼び出し wrap(Class, Test.B)
ラップメソッドの呼び出しに関する警告? それを正しく行う方法はありますか?
乾杯
public class Test {
public class A {
}
public class B extends A {
}
public class WBase<T> {
}
public class WA<T extends A> extends WBase<T> {
}
public class WB extends WA<B> {
}
public <T, W extends WBase<T>> W wrap(Class<W> cls, T item) {
return null;
}
public void test() {
B b = new B();
wrap(WA.class, b);
}
}
アップデート:
私はちょうど私の問題を解決しました!:-) 私が見つけた解決策は、追加のラッパー クラス WABase を導入し、WA をそのクラスから拡張させ、WA からジェネリック パラメータを削除することです。
public class WABase<T extends A> extends WBase<T> {}
public class WA extends WBase<A> {}
public class WB extends WABase<B> {}
さらに、wrap メソッドを次のように再定義しました。
<T, W extends WBase<? super T>> W wrap(Class<W> cls, T item)
今ではすべて正常に動作します:
B b = new B();
A a = new A();
wrap(WB.class, b);
// wrap(WB.class, a); // does not compile, which is right
wrap(WA.class, a);
wrap(WA.class, b);
私を正しい方向に導いてくれた morgano と newacct に感謝します。