时间:2010-03-26 08:04:00

标签: java arrays generics

为什么这里的add()方法不能编译?

Vector<?> vectorList[] = new Vector<?>[10];
vectorList[0].add("elem1");

由于

3 个答案:

答案 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<?>();