捕获Java泛型中的通配符

时间:2013-06-27 10:16:03

标签: java generics wildcard inference

来自this Oracle Java教程:

  

WildcardError示例在编译时产生捕获错误:

public class WildcardError {

    void foo(List<?> i) {
        i.set(0, i.get(0));
    }
}

在此错误演示之后,他们使用辅助方法解决了问题:

public class WildcardFixed {
    void foo(List<?> i) {
        fooHelper(i);
    }

    // Helper method created so that the wildcard can be captured
    // through type inference.
    private <T> void fooHelper(List<T> l) {
        l.set(0, l.get(0));
    }
}

首先,他们说列表输入参数(i)被视为Object

  

在此示例中,编译器将i输入参数处理为   类型为Object。

为什么然后i.get(0)不会返回Object?如果它已经被传递了?

此外,当使用<?>时必须使用辅助方法时,使用<T>的重点是什么。直接使用可以推断的T会不会更好?

1 个答案:

答案 0 :(得分:4)

List<?>表示未知类型的对象列表,它与List<Object>不同。

因为我们不知道列表中i.get(0)的结果中的元素类型被Java视为Object,并且您无法将Object添加到List<?>。如果您的Java可以更聪明,但在使用<?>通配符的更复杂的代码中,很容易使它不安全。