遍历实例化 类 集合的方法调用

Iterating through method call of a collection of instantiated classes

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))
                {

                }
            }
        }

但这很笨重。这种情况有没有更好的迭代方式?

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

正如所写,您的方法是 return 一个普通的 HashMap 并且想要 return 一个通用版本,一个带有通用声明的版本。了解泛型仅适用于编译器而不适用于它们几乎不存在的 JVM,因此如果您的方法未声明为 return,编译器将只知道该方法 return这是一个普通的 HashMap。

为什么不这样做:

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

那么你的第一种方法就不会痛苦了。

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

其实不需要强制转换:equals()方法接受Object类型的参数,所以本次测试:

if ("Test".equals(o))

将正确且安全地工作,即如果 o 是一个字符串 "Test"false 否则它将是 true 并且不会抛出任何异常 否不管 class o 是什么(包括 null)。

如果您的映射键是字符串,值是布尔值,您可以这样声明:

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