为什么这里的add()方法不能编译?
Vector<?> vectorList[] = new Vector<?>[10];
vectorList[0].add("elem1");
由于
答案 0 :(得分:3)
您的代码存在一些问题。首先,数组的元素是未初始化的,因此您将添加到不存在的向量中。其次,添加到类型为通配符的通用容器中没有意义,因为它可能被限制为更有限的类型,因此添加将不安全。
您可以通过填充数组来解决第一个问题:
for (int i = 0; i < 10; i++ ){ vectorList[i] = new Vector<Integer>(); // can replace Integer with // any binding for ? }
现在您已经看到它可以填充不接受类型String的向量,您可以看到为什么add语句随后会失败。您可以通过先前绑定到特定类型(例如String)来解决此问题。
有关详细信息,请参阅Java教程中的Java Generics: Wildcards。
修改的
我似乎对此表示怀疑,因此我有以下完整,可编辑的例子:
import java.util.*; public class Main { public static void main(String[] args){ Vector<?> vectorList[] = new Vector<?>[10]; for (int i = 0; i < 10; i++ ){ vectorList[i] = new Vector<Integer>(); } System.out.println("Hello world"); } }
使用javac Main.java
进行编译不会产生编译错误。
答案 1 :(得分:2)
它无法编译,因为vectorList[0]
的类型为Vector<?>
,您无法在通配符集合上调用add(T)
。您无法调用add(T)
,因为您无法确保要添加的元素属于vectorList[0]
包含的(未知)类型。
这里的教训是泛型类型和数组不能很好地结合在一起。也就是说,如果没有未经检查的强制转换,您就无法生成类型为vectorList
的{{1}},类型Vector<String>[]
会为您提供原始类型来处理,而您无法执行您想要的操作使用Vector[]
(唯一一个不产生警告的人)。而是使用一些Vector<?>[]
。
答案 2 :(得分:0)
因为你必须实例化数组中的每个向量,而不仅仅是数组本身
vectorList[0] = new Vector<?>();