Java 迭代实例化类集合的方法调用
它说我需要将s转换为泛型对象,并且显然不允许我访问任何字符串方法 我可以做这样的打字Java 迭代实例化类集合的方法调用,java,iteration,abstract,Java,Iteration,Abstract,它说我需要将s转换为泛型对象,并且显然不允许我访问任何字符串方法 我可以做这样的打字 for (NodekaClass pet : activePets) { for (String s : pet.getBuffs().keySet()) { } } 但这太笨重了。在这种情况下有更好的迭代方法吗?将公共HashMap getBuffs()更改为公共HashMap getBuffs() 正如编写的那样,您的方法返
for (NodekaClass pet : activePets) {
for (String s : pet.getBuffs().keySet()) {
}
}
但这太笨重了。在这种情况下有更好的迭代方法吗?将
公共HashMap getBuffs()
更改为公共HashMap getBuffs()
正如编写的那样,您的方法返回一个普通的
HashMap
,并希望返回一个通用版本,一个具有通用声明的版本。了解泛型只针对编译器,而不针对几乎不存在泛型的JVM,因此如果您的方法没有声明返回泛型,编译器将只知道该方法返回一个普通哈希映射。为什么不这样做:
for (NodekaClass pet : activePets) {
for (Object o : pet.getBuffs().keySet()) {
if ("Test".equals((String) o))
{
}
}
}
@覆盖
公共HashMap getbuff(){
归还这个。buff;
}
那么您的第一种方法就可以毫无痛苦地工作。使用泛型来避免在运行时在集合中进行类型转换。实际上,您不需要转换:
equals()
方法接受类型对象的参数,因此此测试:
@Override
public HashMap<String,Boolean> getBuffs() {
return this.buffs;
}
将正确且安全地工作,即如果o
是字符串“Test”
(false
),它将是true
,并且不会抛出任何异常,无论o
是什么类(包括null
)。如果您的映射键是字符串,值是布尔值,您可以这样做:
if ("Test".equals(o))
抽象类NodekaClass{
抽象映射getbuff();
抽象虚空setBuffs(地图buff);
}
class Barbarian扩展了NodekaClass{
公众地图爱好者;
@凌驾
公共mapgetbuff(){
归还这个。buff;
}
好的,那么我是否返回通用的“HashMap”而不是我的特定容器?@isaacroas:您返回的是一个普通的HashMap
,并且希望返回一个泛型版本,一个带有泛型声明的版本。请理解泛型仅用于编译器,而不用于几乎不存在泛型的JVM,因此如果您的方法没有声明返回泛型,编译器将只返回k现在,该方法返回一个普通的HashMap。您希望HashMap中有什么?键将始终是字符串?您希望值是什么?
if ("Test".equals(o))
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;
}