使用向量的Java警告:未经检查的调用添加(E)
违反一点代码
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));
不确定这样的错误需要多少信息….
问题是上面的代码不使用generics 。
以下将有效:
Vector moves = new Vector (); move.add(new Integer(x));
<>
的类型名称(在Vector
的情况下,要保存的元素的类型参数E
)告诉编译器它应该期望什么类型的对象。
如果尝试添加具有指定类型的对象(例如在这种情况下,尝试将String
添加到Vector
,则会发生编译时错误,指示某种类型的对象不属于正在添加预期类型。
也就是说,应该尽量不要使用Vector
类。 出于更多目的,从Java Collections Framework实现List
例如ArrayList
的类就足够了,并且性能更好。
编辑
虽然与generics问题没有直接关系,但Adam Paynter在关于使用自动装箱的评论中提出了一个很好的观点。
从Java 5开始,原语及其包装类(例如int
和Integer
将根据需要自动在彼此之间进行转换。
因此,可以将指定为int
或int
文字的值添加到期望Integer
的类中:
Vector v = new Vector (); v.add(5); // Not necessary to use an Integer value.
这不是错误,它只是编译器警告。 矢量通常是参数化的,所以要摆脱警告,只需使用generics:
Vector moves = new Vector (); moves.add(new Integer(x));
如果您别无选择,只能使用非通用数据结构,则可以在方法开头放置@SuppressWarnings("unchecked")
以使警告静音。
只有在您无法选择使用非通用向量时才能执行此操作。 当您使用较旧的库或Java运行时库的某些部分时,通常会发生这种情况。
-
像这样初始化你的矢量
Vector
moves = new Vector (); -
最好使用
java.util.ArrayList
– 它是Vector
的替代品
与代码没有直接关系,但建议使用(从版本> = 5):
Integer.valueOf(x);
代替
new Integer(x);
因为,某些整数值{-128,…,127)被缓存 ,它将始终返回相同的对象。 这对于自动装箱尤其有用。