攻击代码
Vector moves = new Vector();
moves.add(new Integer(x));
错误:
ConnectFour.java:82: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.Vector moves.add(new Integer(x));
不确定这样的错误需要多少信息....
答案 0 :(得分:30)
问题是上面的代码没有使用generics。
以下内容可行:
Vector<Integer> moves = new Vector<Integer>();
move.add(new Integer(x));
<>
内的类型名称(在Vector
的情况下,要保留的元素的类型参数E
)告诉编译器它应该期望什么类型的对象。 / p>
如果尝试添加具有指定类型的对象(例如在这种情况下,尝试将String
添加到Vector<Integer>
,则会发生编译时错误,表明正在添加一种不属于预期类型的对象。
那就是说,应该尽量不要使用Vector
类。出于更多目的,从List
实现ArrayList
的类Java Collections Framework就足够了,表现更好。
修改强>
虽然与泛型问题没有直接关系,但Adam Paynter在关于使用自动拳击的评论中提出了一个很好的观点。
自Java 5以来,原语及其包装类,例如如有必要,int
和Integer
会自动相互转换。
因此,可以将指定为int
或int
字面值的值添加到期望Integer
的类中:
Vector<Integer> v = new Vector<Integer>();
v.add(5); // Not necessary to use an Integer value.
答案 1 :(得分:4)
这不是错误,只是编译器警告。矢量通常是参数化的,所以要摆脱警告,只需使用泛型:
Vector<Integer> moves = new Vector<Integer>();
moves.add(new Integer(x));
答案 2 :(得分:3)
如果您别无选择,只能使用非通用数据结构,则可以将@SuppressWarnings("unchecked")
放在方法的开头,以使警告静音。
只有在您无法选择使用非通用向量时才能执行此操作。当您使用较旧的库或Java运行时库的某些部分时,通常会发生这种情况。
答案 3 :(得分:1)
像这样初始化你的矢量
Vector<Integer> moves = new Vector<Integer>();
最好使用java.util.ArrayList
- 它取代Vector
答案 4 :(得分:0)
与代码没有直接关系,但使用recommended(版本&gt; = 5):
Integer.valueOf(x);
而不是
new Integer(x);
因为某些整数值{-128,...,127)缓存,它将始终返回相同的对象。这对于autoboxing非常有用。