错误:
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?
答案 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)
根据wildcards,the question mark (?), called the wildcard, represents an unknown type
而非通用类型,因为它是unknown
类型,编译器无法接受String
。
答案 4 :(得分:0)
您可以将使用通配符定义的任何列表视为只读。不过,您可以执行一些非读取操作。
来自the docs: