使用向量的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开始,原语及其包装类(例如intInteger将根据需要自动在彼此之间进行转换。

因此,可以将指定为intint文字的值添加到期望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运行时库的某些部分时,通常会发生这种情况。

  1. 像这样初始化你的矢量

     Vector moves = new Vector(); 
  2. 最好使用java.util.ArrayList – 它是Vector的替代品

与代码没有直接关系,但建议使用(从版本> = 5):

 Integer.valueOf(x); 

代替

 new Integer(x); 

因为,某些整数值{-128,…,127)被缓存 ,它将始终返回相同的对象。 这对于自动装箱尤其有用。