【问题标题】:Getting a compiling error: warning: [unchecked] unchecked call to add(E) as a member of the raw type ArrayList出现编译错误:警告:[unchecked] unchecked call to add(E) as a member of raw type ArrayList
【发布时间】:2016-11-13 16:29:14
【问题描述】:

我正在开发一个基于文本的 RPG。在其中一个类中有一个处理保存和加载游戏的 ArrayList。 ArrayList 中既有整数又有字符串。

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

向列表中添加元素的每个变量都会收到如下警告:

D:\Backup\RPG\src\rpg\Player.java:86: 警告:[未选中] 未选中 调用 add(E) 作为原始类型 ArrayList 的成员 getInventory().add(item);其中 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());
    }
}

【问题讨论】:

  • 你需要使用泛型。
  • 警告不是错误。

标签: java arraylist compilation


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 然后我必须转换整数,例如saveGame.add(p.getCurrLoc());,当我向列表添加值时。最好的方法是什么?
  • 啊,我没有看到那里的整数。但总有String.valueOf() 可以帮助您。
  • 我不确定如何正确执行 thios,我尝试这样写:saveGame.add String.valueOf(p.getCurrLoc()); 但收到错误。
【解决方案2】:

(代表 OP 发布)

我解决了这样的问题:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的帮助!您能否给我一个示例,说明如何在我的代码中实现这一点。这是一个字符串saveGame.add(p.getName()); 这是一个整数saveGame.add(p.getCurrLoc());
    • 抱歉,我刚才看到您有一个后续问题。正如其他人所说,警告不是错误,只要您如上所述了解其目的,您就可以忽略它。
    • 但如果你想删除它,只需使用适当的类型定义 ArrayList,例如 ArrayList。如果您打算放置不同类型的对象,请使用最高常见的超类或其他人所说的 Object (ArrayList)。
    猜你喜欢
    • 2015-05-06
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2011-10-16
    相关资源
    最近更新 更多