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