使用向量的Java警告:未经检查的调用添加(E)

时间:2009-12-03 15:24:06

标签: java vector

攻击代码

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));

不确定这样的错误需要多少信息....

5 个答案:

答案 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以来,原语及其包装类,例如如有必要,intInteger会自动相互转换。

因此,可以将指定为intint字面值的值添加到期望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)

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

    Vector<Integer> moves = new Vector<Integer>();
    
  2. 最好使用java.util.ArrayList - 它取代Vector

答案 4 :(得分:0)

与代码没有直接关系,但使用recommended(版本&gt; = 5):

Integer.valueOf(x);

而不是

new Integer(x);

因为某些整数值{-128,...,127)缓存,它将始终返回相同的对象。这对于autoboxing非常有用。