java中的通配符、泛型、setter和getter

java中的通配符、泛型、setter和getter,java,generics,Java,Generics,我有一个泛型类和子类 public class GenericClass<C> { private C value; public C getValue() { return value; } public void setValue(C value) { this.value = value; } } 公共类GenericClass { 私有C值; 公共C getValue(){return value;} public void setValue(C

我有一个泛型类和子类

public class GenericClass<C>
{
    private C value;

    public C getValue() { return value; }

    public void setValue(C value) { this.value = value; }
}
公共类GenericClass
{
私有C值;
公共C getValue(){return value;}
public void setValue(C值){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 obj1=…//这里有一个值
GenericClass obj2=…//这里有一个值
//我知道obj1与obj2的类型相同,但我不知道这种类型。
obj1.setValue(obj2.getValue());
最后一行生成编译错误,该错误为:

类型GenericClass中的方法setValue(capture#11 of?)为 不适用于参数(第12页,共页)

我如何才能做到这一点(比如强制转换通配符…?

由于
GenericClass
不包含实际封闭类型的信息,编译器无法确保这两个类是兼容的。您应该使用一个名为泛型类型参数的具体参数。如果您不知道具体的类型,您仍然可以通过将上述代码封装在通用方法中来实现两个类型参数的相同性:

public <T> void someMethod() {
  GenericClass<T> obj1 = ... // has a value here
  GenericClass<T> obj2 = ... // has a value here

  obj1.setValue(obj2.getValue());
}
public void someMethod(){
GenericClass obj1=…//在此处有一个值
GenericClass obj2=…//在此处有一个值
obj1.setValue(obj2.getValue());
}

如果这是不可能的,您可以作为最后手段尝试显式强制转换,或使用原始类型。这将把编译错误转换为未检查的强制转换警告。

您需要键入您的方法:

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());
}
public static“如果这不可能”即使不可能,他们仍然可以将上述方法设置为私有助手方法,然后在需要的地方调用它,并且由于捕获转换,它将工作