遍历实例化 类 集合的方法调用
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;
}
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;
}