为什么不能添加String来键入List <! - ? - >?

时间:2013-09-05 10:02:43

标签: java generics

错误:

The method add(capture#1-of ?) in the type List<capture#1-of ?> is not 
applicable for the arguments (String)

代码:

List<?> to = new ArrayList<Object>();
to.add(new String("here"));

由于List<?>是泛型类型List,因此可以是任何类型,那么为什么它不接受添加方法中的String?

5 个答案:

答案 0 :(得分:12)

List<?>是某种类型的列表,其未知。因此,除了null而不破坏列表的类型安全性之外,您无法向其添加任何内容:

List<Integer> intList = new ArrayList<>();
List<?> unknownTypeList = intList;
unknownTypeList.add("hello"); // doesn't compile, now you should see why

答案 1 :(得分:6)

  

字符串不可接受吗?

没有。 <?>表示类型未知,编译器无法确定是否可以添加任何类型(包括String)

答案 2 :(得分:2)

您可以指定下限:

List<? super Object> to = new ArrayList<Object>();
to.add(new String("here")); // This compiles

现在编译器确保列表可以包含任何Object

答案 3 :(得分:1)

根据wildcardsthe question mark (?), called the wildcard, represents an unknown type而非通用类型,因为它是unknown类型,编译器无法接受String

答案 4 :(得分:0)

您可以将使用通配符定义的任何列表视为只读。不过,您可以执行一些非读取操作。

来自the docs

  • 您可以添加null。
  • 您可以调用清除。
  • 您可以获取迭代器并调用remove。
  • 您可以捕获通配符并编写从列表中读取的元素。