9

这个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?如果它已经这样传递了?

此外,使用 a 的意义何在<?>,那么您必须使用辅助方法使用<T>. T直接使用哪个可以推断会不会更好?

4

1 回答 1

4

List<?>确实意味着未知类型的对象列表,它与List<Object>.

因为我们不知道列表结果中元素的类型i.get(0)被 Java 认为是Object,所以不能添加ObjectList<?>. 如果您的 Java 可能更智能,但在带有<?>通配符的更复杂的代码中,很容易使其没有类型安全。

于 2013-06-27T11:12:53.520 回答