繁体   English   中英

捕获Java泛型中的通配符

[英]Capturing wildcards in Java generics

这个 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会不会更好?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM