获取编译错误:警告:[未选中]未选中调用添加(E)作为原始类型ArrayList的成员

时间:2016-11-13 16:29:14

标签: java arraylist compilation

我正在开发基于文本的RPG。在其中一个类中有一个处理保存和加载游戏的ArrayList。 ArrayList中有Integers和Strings。

这是一个字符串:saveGame.add(p.getName());
这是一个整数:saveGame.add(p.getCurrLoc());

向列表添加元素的每个变量都会收到类似这样的警告:

  

D:\ Backup \ RPG \ src \ rpg \ Player.java:86:警告:[取消选中]未选中   调用add(E)作为原始类型ArrayList的成员           。getInventory()添加(项目);其中E是一个类型变量:       E扩展在类ArrayList

中声明的Object

代码:

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());
    }
}

3 个答案:

答案 0 :(得分:3)

首先,这是一个警告,而不是错误。您仍然可以在此状态下运行代码。它只是为许多潜在问题打开了大门。

基本上,您应该定义列表,以便了解每个元素的类型。这是使用泛型完成的。

因此,您可以将列表声明为字符串列表,如下所示:

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

这意味着您只能向列表中添加字符串。但是,它也意味着getter方法将始终返回字符串,因此不需要进行转换。

答案 1 :(得分:0)

最新版本的Java允许您使用类似ArrayList的语法指定将放置在ArrayList中的对象类型。这允许编译器检查在编译和执行时添加到列表中的任何对象的类型,并允许更安全且更不容易出错的代码

如果您使用旧版本(没有),则编译器无法进行此检查,因此它会向您发出警告。

答案 2 :(得分:0)

(代表OP发布)

我解决了这个问题:

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