如何确定集合中对象的类类型?
class Human{...}
class Man extends Human{...}
class Women extends Human{...}
def humans = Human.findAll()
humans.each(){ human ->
// ??? , it is not work
if ( human instanceof Man ) { println "Man" }
if ( human instanceof Woman ) { println "Woman" }
}
非常感谢,
汤姆
答案 0 :(得分:15)
根据你的描述,我会说你正在遇到Hibernate代理对象(即类名是:Human _ $$ javaassist *)。解决方案是使用GORM提供的insatnceOf版本。无需急于获取或使用其他方法。
def planet = Planet.get(1)
planet.humans.each(){ human ->
if (human.instanceOf(Man)) { println "is Man"}
if (human.instanceOf(Woman)) { println "is Woman"}
}
注意区别human.instanceOf(Man)而不是人类实例Man。使用gorm方法而不是java关键字。
您可以在[解释] [1]中看到参考文档的这一部分。请参阅“懒惰的单端关联和代理”小节
[1]:http://grails.org/doc/latest/guide/single.html#5.5.2.8渴望和懒惰的提取
答案 1 :(得分:4)
看起来好像应该有效。
一些随意的想法:你的人类是否正确建造?也许他们真的不是男人或女人的例子。
您可以使用多态进行一些测试:
class Human{ ...
def speak() { println "Human" }
}
class Man extends Human{ ...
def speak() { println "Man" }
}
class Women extends Human{ ...
def speak() { println "Woman" }
}
def humans = humanService.all()
humans.each(){ human ->
human.speak()
}
如果最后一行打印出“人类人类”,那么人类就没有正确构建,它们都是人类实例,而不是人/人。如果它显示错误,那么它们就是其他东西(如空值或其他东西)
祝你好运!答案 2 :(得分:1)
上面的代码没有任何问题,所以我的猜测是Human.findAll()
返回一个空集合,这可以解释为什么没有打印任何内容。你可以试试这个代码吗?
class Human{...}
class Man extends Human{...}
class Women extends Human{...}
println "You have ${Human.findAll().size()} humans"
如果打印出“你有0个人”,那么我的猜测是正确的。如果您想获得Human
的所有实例的列表,那么最好使用Human.list()
代替Human.findAll()
答案 3 :(得分:1)
实际上是instanceof的问题。我再次遇到麻烦了。我找到了这篇文章:
http://community.jboss.org/wiki/ProxyVisitorPattern
我的意思是当你的班级有一些关系时会出现麻烦。 例如:
def planet = Planet.get(1)
planet.humans.each(){ human ->
//it is not work, see the link above
if (human instanceof Man) { println "is Man"}
if (human instanceof Woman) { println "is Woman"}
}
汤姆
答案 4 :(得分:0)
谢谢你的帮助。我试试你的考试。方法 speak()返回预期结果。
为了男人回归“男人”,女人回归“女人”。
你的测试结束了,但我的麻烦总是在这里
也许我忘了了解更多信息:
此代码来自 Grails项目。我的意思是,这并不重要
我正好使用GORM呼叫:
def humans = Human.findAll()
托马斯
答案 5 :(得分:0)
哪个版本的Grails?我刚刚在Grails 1.2.2控制台中尝试过它,它可以工作:
new Woman(name: "Julie").save()
new Woman(name: "Xena").save()
new Woman(name: "Mary").save()
new Man(name: "James").save()
new Man(name: "Tony").save(flush: true)
def people = Human.list()
for (p in people) {
println ">> ${p.name} (${p.getClass()})"
if (p instanceof Man) println "It's a man"
if (p instanceof Woman) println "It's a woman"
}
也许这是一个已修复的问题?