Java中的泛型向量

Java中的泛型向量,java,arrays,generics,Java,Arrays,Generics,为什么这里的add()方法不编译 Vector<?> vectorList[] = new Vector<?>[10]; vectorList[0].add("elem1"); vectorList[]=新向量[10]; 向量列表[0]。添加(“elem1”); 谢谢您的代码有几个问题。首先,数组的元素未初始化,因此要添加到不存在的向量。其次,添加到类型为通配符的泛型容器没有意义,因为它可能被限制为更有限的类型,因此添加将不安全 您可以通过填充阵列来解决第一个问题:

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

Vector<?> vectorList[] = new Vector<?>[10];
vectorList[0].add("elem1");
vectorList[]=新向量[10];
向量列表[0]。添加(“elem1”);

谢谢

您的代码有几个问题。首先,数组的元素未初始化,因此要添加到不存在的向量。其次,添加到类型为通配符的泛型容器没有意义,因为它可能被限制为更有限的类型,因此添加将不安全

您可以通过填充阵列来解决第一个问题:

for (int i = 0; i < 10; i++ ){ vectorList[i] = new Vector<Integer>(); // can replace Integer with // any binding for ? } 对于(int i=0;i<10;i++){ vectorList[i]=new Vector();//可以将整数替换为 //对你有约束力吗? } 现在您已经看到它可以用不接受类型字符串的向量填充,您可以看到为什么add语句随后会失败。您可以通过先前绑定到特定类型(例如字符串)来修复此问题

有关更多信息,请参见Java教程中的

编辑
我似乎有点怀疑,因此我有以下完整的可编译示例:

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"); } } 导入java.util.*; 公共班机 { 公共静态void main(字符串[]args){ 向量向量列表[]=新向量[10]; 对于(int i=0;i<10;i++){ 向量列表[i]=新向量(); } System.out.println(“你好世界”); } }
使用
javac Main.java
编译时不会出现编译错误。

您的代码有几个问题。首先,数组的元素未初始化,因此要添加到不存在的向量。其次,添加到类型为通配符的泛型容器没有意义,因为它可能被限制为更有限的类型,因此添加将不安全

您可以通过填充阵列来解决第一个问题:

for (int i = 0; i < 10; i++ ){ vectorList[i] = new Vector<Integer>(); // can replace Integer with // any binding for ? } 对于(int i=0;i<10;i++){ vectorList[i]=new Vector();//可以将整数替换为 //对你有约束力吗? } 现在您已经看到它可以用不接受类型字符串的向量填充,您可以看到为什么add语句随后会失败。您可以通过先前绑定到特定类型(例如字符串)来修复此问题

有关更多信息,请参见Java教程中的

编辑
我似乎有点怀疑,因此我有以下完整的可编译示例:

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"); } } 导入java.util.*; 公共班机 { 公共静态void main(字符串[]args){ 向量向量列表[]=新向量[10]; 对于(int i=0;i<10;i++){ 向量列表[i]=新向量(); } System.out.println(“你好世界”); } }
使用
javac Main.java进行编译不会出现编译错误。

因为您必须实例化数组中的每个向量,而不仅仅是数组本身

vectorList[0] = new Vector<?>();
vectorList[0]=新向量();

因为您必须实例化数组中的每个向量,而不仅仅是数组本身

vectorList[0] = new Vector<?>();
vectorList[0]=新向量();

它无法编译,因为
vectorList[0]
属于
Vector
类型,并且不能对通配符集合调用
add(t)
。无法调用
add(t)
,因为无法确保要添加的元素属于
vectorList[0]
包含的(未知)类型


这里的教训是泛型类型和数组不能很好地结合在一起。也就是说,如果没有未选中的强制转换,您无法将
vectorList
类型设置为
Vector[]
,类型
Vector[]
将为您提供一个原始类型来处理,并且您无法使用
Vector[]
(唯一一个不产生警告的类型)来执行您想要的操作。相反,请使用一些
列表
,它不会编译,因为
向量列表[0]
属于
向量
类型,并且不能对通配符集合调用
添加(t)
。无法调用
add(t)
,因为无法确保要添加的元素属于
vectorList[0]
包含的(未知)类型


这里的教训是泛型类型和数组不能很好地结合在一起。也就是说,如果没有未选中的强制转换,您无法将
vectorList
类型设置为
Vector[]
,类型
Vector[]
将为您提供一个原始类型来处理,并且您无法使用
Vector[]
(唯一一个不产生警告的类型)来执行您想要的操作。相反,使用一些
列表

即使我实例化了向量,它仍然不会编译。即使我实例化了向量,它仍然不会编译。在这种情况下,通常最好发布编译器错误。由于您还没有发布Java锅炉板,我们无法保证确切的错误是什么。在这种情况下,通常最好发布编译器错误。由于您没有发布Java锅炉板,我们无法保证确切的错误是什么。这也不会编译(无法实例化类型向量)@portoalet,您使用了吗?或者你的新语句中的特定类型?@portoalet,我已经测试过了,没有任何问题。@portoalet,那就可以解释了。当您实际实例化时,需要将通配符绑定到特定类型。嗯,好的,因此无法将其保留为通配符和编译器。这也不会编译(无法实例化类型向量)@portoalet,您使用了吗?或者你的新语句中的特定类型?@portoalet,我已经测试过了,没有任何问题。@portoalet,那就可以解释了。在实际实例化.hm ok时,需要将通配符绑定到特定类型,因此无法将其保留为通配符并进行编译