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))
{
}
}
}
但这很笨重。在这种情况下有更好的迭代方法吗?
答案 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;
}