捕获Java泛型中的通配符

Rol*_*all 9 java generics inference wildcard

这个 Oracle Java教程:

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

public class WildcardError {

    void foo(List<?> i) {
        i.set(0, i.get(0));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

此外,使用a <?>时你必须使用辅助方法是什么意思<T>.不能直接使用T可以推断出来的吗?

小智 4

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

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