我正在尝试为包装器创建一个工厂方法,但我对泛型类型感到困惑。
我有两个类 A 和 B,其中 B 派生自 A。然后我有一个 Wrappber 基类 (WBase) 和 A 和 B 的包装类 WA 和 WB。
编译下面的代码时,我得到一个
类型安全:Test 类型的泛型方法 wrap(Class, T) 的未经检查的调用 wrap(Class, Test.B)
在调用 wrap 方法时发出警告?任何想法如何正确地做到这一点?
干杯
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 将我推向正确的方向。