你能不能在java中解释一下这个编译器警告?

时间:2015-02-27 04:27:17

标签: java markov-chains

我得到的编译器警告是:

Markov.java:40: warning: [unchecked] unchecked call to addElement(E) as a member of the raw type java.util.Vector
    suf.addElement(word);

这是代码:

   void add(String word)
   {
        Vector suf = (Vector) statetab.get(prefix);
        if (suf == null) {
        suf = new Vector();
        statetab.put(new Prefix(prefix), suf);
    }
    suf.addElement(word);
    prefix.pref.removeElementAt(0);
    prefix.pref.addElement(word);  // same error here

我是Java的新手,我正在尝试运行Brian W. Kernighan和Rob Pike的编程实践中的代码。

2 个答案:

答案 0 :(得分:2)

Vector是一种集合类型,可以声明使用"泛型"它包含什么类型的元素。事实上,强烈建议您在其中声明内容,以及发出警告的原因。

使用尖括号(<Type>)声明集合中的类型。在您的情况下,Vector包含字符串,因此它变为Vector<String>

Hashtable<Prefix,Vector<String>> statetab; // proper type for statetab

void add(String word)
{
    Vector<String> suf = statetab.get(prefix);
    if (suf == null) {
        suf = new Vector<String>();
        statetab.put(new Prefix(prefix), suf);
    }
    suf.addElement(word);
    prefix.pref.removeElementAt(0);
    prefix.pref.addElement(word);  // same error here

您可以修改上面的代码 - 但是您没有显示您声明statetab的位置,因此我猜测了您应该如何更改其类型。

您应该可以更改pref课程中的字段Prefix并将其设为Vector<String>

答案 1 :(得分:2)

警告是因为您使用的是raw types,因为您使用了泛型类或没有任何类型参数的接口。您可以使用类似

的类型指定类型
Vector<String> suf = (Vector<String>) statetab.get(prefix);

另外,我建议你转向更现代的List。此外,如果您在statetab上修复了通用,那么您就不需要进行强制转换。