2015-02-27 2 views
2

предупреждение компилятора, что я получаю:Не могли бы вы рассказать мне об этом предупреждении компилятора в java?

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 и я пытаюсь запустить код из практики программирования Брайан W Керниган и Роб Пайк.

+1

Это связано с использованием дженериков. Вот [хороший учебник] (http://docs.oracle.com/javase/tutorial/java/generics/). В частности, вы захотите посмотреть [этот раздел] (http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html). – Jeffrey

ответ

2

A Vector - тип коллекции, который может объявлять с использованием «generics» того типа элемента, который он содержит. На самом деле, настоятельно рекомендуется, чтобы вы заявляли, что внутри него, и именно поэтому вы получаете предупреждение.

Вы указываете, какой тип находится внутри коллекции, используя угловые скобки (<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>.

+0

Ох. Statetab - Hashtable. Извините за неудобства. – Ognom

+0

О, мой. Спасибо за вашу помощь, Эрвин. Я очень ценю это. :) – Ognom

2

Предупреждение связано с тем, что вы используете raw types, потому что вы использовали общий класс или интерфейс без каких-либо аргументов типа. Вы можете указать тип с чем-то вроде

Vector<String> suf = (Vector<String>) statetab.get(prefix); 

Кроме того, я предлагаю вам перейти к немного более современный List. Кроме того, если вы исправите общий код на statetab, вам не нужно бросать.

+0

Я могу голосовать из-за низкого репу, но я ценю вашу помощь. Благодаря :) – Ognom

Смежные вопросы