2016-11-13 14 views
0

テキストベースのRPGを開発しています。クラスの1つに、保存とロード・ゲームを処理するArrayListがあります。 ArrayListには整数と文字列の両方があります。 コンパイルエラーを取得する:警告:[未チェック]未処理のタイプのメンバーとしてadd(E)の呼び出しをチェックしないArrayList

この

はStringです: saveGame.add(p.getName());
そして、これは整数です:

D:\Backup\RPG\src\rpg\Player.java:86: warning: [unchecked] unchecked call to add(E) as a member of the raw type ArrayList getInventory().add(item); where E is a type-variable: E extends Object declared in class ArrayList

コード:saveGame.add(p.getCurrLoc());

リストに要素を追加しているすべての変数はこの1つのような警告が表示され

public class Data { 

private ArrayList saveGame; 

//Sparar en ny rad i sparfilen 
public void writeData(String in) {   

    try { 
     FileWriter out = new FileWriter("Savegame.txt", true); 
     out.write(in + "\n"); 
     out.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(Data.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public void save(Player p) { 
    clearData(); 


    saveGame = new ArrayList(); 
    saveGame.add(p.getName());     
    saveGame.add(p.getCurrLoc());    
    saveGame.add(p.getStrength());    
    saveGame.add(p.getConstitution());   
    saveGame.add(p.getDexterity());    
    saveGame.add(p.getHitpoints());    
    saveGame.add(p.getLevel());     
    saveGame.add(p.getxP());      
    saveGame.add(p.getxPToLvlUp());    
    saveGame.add(p.getArmorClass());   
    saveGame.add(p.getNrOfPotions());   
    saveGame.add(p.getEqWeapon().getName()); 


    for(Object element : p.getInventory()) { 
     if(element instanceof Weapon) { 
      saveGame.add(((Weapon) element).getName()); 
     } else if(element instanceof Item) { 
      saveGame.add(((Item) element).getName()); 
     } else if(element instanceof Armor) { 
      saveGame.add(((Armor) element).getName()); 
     } 
    } 

    for(Object element : saveGame) { 
     writeData(element.toString()); 
    } 
} 
+0

は、私はこのような問題を解決しました。 – SLaks

+0

警告はエラーではありません。 –

答えて

0

最新バージョンのJavaでは、オブジェクトのタイプを指定できます。このArrayListのような構文を使用してArrayListに配置します。これにより、コンパイラは、コンパイル時および実行時にリストに追加するオブジェクトの種類をチェックすることができ、より安全でエラーが発生しにくいコードを作成できます。

以前のバージョンを使用した場合コンパイラはこのチェックを行うことができないので、警告が表示されます。

+0

ありがとうございました!私のコードでこれを実装する方法の例を教えてください。 これは文字列 'saveGame.add(p.getName())である;' とこのInteger 'saveGame.add(p.getCurrLoc());' –

+0

申し訳ありませんが、私はちょうど今、あなたがフォローしていた見ました質問をする。他の人が述べているように、上記のようにその目的を理解している限り、警告は間違いではありません。 – TDWebDev

+0

しかし、削除する場合は、適切なタイプ(ArrayList など)を使用してArrayListを定義するだけです。異なるタイプのオブジェクトを配置する予定の場合は、他の誰かが述べたように最も高い共通スーパークラスまたはObjectを使用します(ArrayList )。 – TDWebDev

1

まず、これは警告であり、エラーではありません。この状態でコードを実行することはできます。多くの潜在的な問題の扉を開くだけです。

基本的には、各要素がどのような種類であるかを知るために、リストを定義する必要があります。これはジェネリックを使用して行われます。

次のようにだからあなたは文字列のリストとしてリストを宣言することができます。

ArrayList<String> saveGame = new ArrayList<String>(); 

これは、あなただけのリストに文字列を追加できることを意味します。しかし、getterメソッドは常に文字列を返すので、キャストは必要ありません。

+0

次に、値をリストに追加するときに、 'saveGame.add(p.getCurrLoc());'のような整数を変換する必要があります。これを行う最善の方法は何ですか? –

+0

ああ、私は整数を見ませんでした。しかし、それを助けるのに常に 'String.valueOf()'があります。 –

+0

私は正確にthiosを行う方法がわかりません、私はこのように書くようにしました: 'saveGame.add String.valueOf(p.getCurrLoc());' しかし、エラーが発生しました。 –

0

(OPの代わりに掲示)。あなたがジェネリックを使用する必要が

ArrayList<Object> saveGame = new ArrayList<Object>(); 
関連する問題