2015-02-27 1 views
2

L'avertissement du compilateur que je reçois est:Pouvez-vous m'expliquer à propos de cet avertissement du compilateur dans java?

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

Voici le code:

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 

Je suis nouveau à Java et je suis en train d'exécuter le code de la pratique de la programmation par Brian W Kernighan et Rob Pike.

+1

Ceci a à voir avec votre utilisation de génériques. Voici un [joli tutoriel] (http://docs.oracle.com/javase/tutorial/java/generics/). Plus précisément, vous voudrez regarder [cette section] (http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html). – Jeffrey

Répondre

2

Un Vector est un type de collection qui peut déclarer à l'aide de «génériques» quel type d'élément il contient. En fait, il est fortement recommandé de déclarer ce qu'il contient, et c'est pourquoi vous recevez l'avertissement.

Vous déclarez le type à l'intérieur de la collection à l'aide des chevrons (<Type>). Dans votre cas, le Vector contient des chaînes, il devient 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 

Vous pouvez corriger votre code comme ci-dessus - mais vous ne présentez pas où vous avez déclaré statetab donc je fait une estimation à la façon dont vous devriez changer de type.

Vous devriez également modifier le champ pref à l'intérieur de la classe Prefix et en faire également un Vector<String>.

+0

Oh. Statetab est une table de hachage. Désolé pour le dérangement. – Ognom

+0

Oh mon dieu! Merci pour votre aide, Erwin. J'apprécie vraiment cela. :) – Ognom

2

L'avertissement est dû au fait que vous utilisez raw types car vous avez utilisé une classe ou une interface générique sans les arguments de type. Vous pouvez spécifier le type avec quelque chose comme

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

Aussi, je vous suggère de passer à la List un peu plus moderne. En outre, si vous corrigez le générique sur statetab, vous ne devriez pas avoir besoin de diffuser.

+0

Je peux voter en raison de faible repu mais j'apprécie votre aide. Merci :) – Ognom