【问题标题】:Can you kindly explain me about this compiler warning in java?你能解释一下java中的这个编译器警告吗?
【发布时间】:2015-02-27 04:27:17
【问题描述】:

我得到的编译器警告是:

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 的 The Practice of Programming 的代码。

【问题讨论】:

标签: java markov-chains


【解决方案1】:

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 的位置,所以我猜测您应该如何更改其类型。

您可能还应该更改 Prefix 类中的字段 pref 并将其设为 Vector&lt;String&gt;

【讨论】:

  • 哦。 Statetab 是一个哈希表。很抱歉给您带来不便。
  • 天哪。谢谢你的帮助,欧文。对此,我真的非常感激。 :)
【解决方案2】:

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

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

另外,我建议您改用更现代的List。此外,如果您修复了 statetab 上的泛型,那么您不需要强制转换。

【讨论】:

  • 由于声望低,我可以投票,但感谢您的帮助。谢谢:)
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 2022-11-24
  • 2016-12-30
相关资源
最近更新 更多