我正试图为包装器创建一个工厂方法,并且我在泛型类型上步履蹒跚。
我有两个类A和B,其中B派生自A,然后我有一个Wrappber基类(WBase),以及A和B的包装类WA和WB。
在编译下面的代码时,我会得到一个
类型安全性:类型测试的泛型方法包装(Class,T)的未检查调用包装(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> {} 此外,我还将包装方法重新定义为
<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);感谢莫嘉诺和纽阿特把我推向了正确的方向。
发布于 2013-06-30 11:22:10
这部分的问题是:
wrap(WA.class, b)WA是一个参数化类,当您使用WA.class时,您使用的是"raw“类型。
发布于 2013-06-30 21:58:54
您可以绕过这样一个事实:WA.class是Class<WA>,而不是您想要的Class<WA<B>>:
wrap((Class<WA<B>>)(Class<?>)WA.class, b);当然,您会收到未经检查的强制发布警告。
发布于 2013-06-30 11:26:41
由于b是B类型的,那么在wrap(WA.class, b)调用中T是B。由于T是B,那么作为第一个参数传递的Class实例的类型化变量必须扩展WBase<B>。WA.class的类型变量是WA,它显然扩展了WBase<T>。
但是T in public class WA<T extends A> extends WBase<T> 并不是中的这是两个独立的T,如果你用(比方说,S )切换一个T,你会发现它仍然可以编译。
https://stackoverflow.com/questions/17389735
复制相似问题