迭代实例化类集合的方法调用

时间:2015-12-23 20:42:54

标签: java iteration abstract

abstract class NodekaClass {
    abstract HashMap getBuffs();
    abstract void setBuffs(HashMap<String, Boolean> buffs);   
}

class Barbarian extends NodekaClass {

    public HashMap <String, Boolean> buffs;

    @Override
    public HashMap getBuffs() {
        return this.buffs;
    }
}

现在问题..如果我尝试这样做:

        for (NodekaClass pet : activePets) {
            for (String s : pet.getBuffs().keySet()) {

            }
        }

它说我需要将s作为通用对象进行转换,并且不会让我明显访问任何String方法。

我可以做这样的类型转换......

       for (NodekaClass pet : activePets) {
            for (Object o : pet.getBuffs().keySet()) {
                if ("Test".equals((String) o))
                {

                }
            }
        }

但这很笨重。在这种情况下有更好的迭代方法吗?

5 个答案:

答案 0 :(得分:2)

public HashMap getBuffs()更改为public HashMap<String, Boolean> getBuffs()

如上所述,您的方法返回一个普通的HashMap,并希望返回一个通用版本,其中一个版本具有通用声明。理解泛型仅适用于编译器,而不适用于几乎不存在的JVM,因此如果您的方法未声明返回它,编译器将只知道该方法返回一个普通的HashMap。

答案 1 :(得分:0)

为什么不这样做:

@Override
public HashMap<String,Boolean> getBuffs() {
    return this.buffs;
}

然后你的第一种方式会毫无痛苦地工作。

答案 2 :(得分:0)

使用泛型https://docs.oracle.com/javase/tutorial/java/generics/来避免在集合中运行时进行类型转换。

答案 3 :(得分:0)

实际上,您不需要投射:equals()方法接受Object类型的参数,因此此测试:

if ("Test".equals(o))

将正常且安全地工作,即true如果o是字符串"Test"(否则为false),它将为o并且不会抛出任何异常否无论课程null是什么(包括while read filename; do cp -r "$source_dir/$filename" "$target_dir/${filename%/*}"; done < nothelp2.txt )。

答案 4 :(得分:0)

如果你的地图键是字符串,而值是布尔值,你可以这样说出来:

abstract class NodekaClass {
abstract Map<String, Boolean> getBuffs();
abstract void setBuffs(Map<String, Boolean> buffs);   

}

class Barbarian extends NodekaClass {

public Map<String, Boolean> buffs;

@Override
public Map<String, Boolean>getBuffs() {
    return this.buffs;
}