在Grails中的instanceof

时间:2010-06-03 10:34:04

标签: grails

如何确定集合中对象的类类型?

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

非常感谢,
汤姆

6 个答案:

答案 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)

Grails with Hibernate中的

实际上是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"
}

也许这是一个已修复的问题?