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

时间:2011-08-11 10:09:51

标签: java generics

我有一个带有子类的泛型类。

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?)

我该怎么做(比如投射通配符......)?

2 个答案:

答案 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());
}

试试吧。如果它没有编译(并提供代码),请告诉我