捕获Javagenerics中的通配符

从这个 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  void fooHelper(List l) { l.set(0, l.get(0)); } } 

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

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

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

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

List表示未知类型的对象列表,它与List

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