我有一个带有子类的泛型类。
public class GenericClass<C>
{
private C value;
public C getValue() { return value; }
public void setValue(C value) { this.value = value; }
}
在我的代码中,我使用子类而不知道哪些子类,但我知道这两个子类是相同的类型:
GenericClass<?> obj1 = ... // has a value here
GenericClass<?> obj2 = ... // has a value here
// I know that obj1 is the same type of obj2 but I don't know this type.
obj1.setValue(obj2.getValue());
最后一行产生编译错误:
GenericClass类型的方法setValue(capture#11-of?)是 不适用于参数(捕获#12-of?)
我该怎么做(比如投射通配符......)?
答案 0 :(得分:3)
由于GenericClass<?>
不包含实际封闭类型的信息,因此编译器无法确保两个这样的类是兼容的。您应该使用具体的命名泛型类型参数。如果您不知道具体类型,您仍然可以通过例如强制执行两种类型参数的相同性。将上述代码括在通用方法中:
public <T> void someMethod() {
GenericClass<T> obj1 = ... // has a value here
GenericClass<T> obj2 = ... // has a value here
obj1.setValue(obj2.getValue());
}
如果无法做到这一点,您可以作为最后的手段尝试显式强制转换或使用原始类型。这会将编译错误交换为未选中的强制警告。
答案 1 :(得分:1)
您需要输入您的方法:
public static <T extends GenericClass<?>> void someMethod() {
T obj1 = ... // has a value here
T obj2 = ... // has a value here
// Now they are the same type
obj1.setValue(obj2.getValue());
}
试试吧。如果它没有编译(并提供代码),请告诉我