2010-06-03 69 views
6

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

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

是humanService.all()返回绝对项? – 2010-06-03 10:39:55

+0

这是在Grail项目中,我使用> Human.findAll() – 2010-06-03 10:44:53

回答

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的人类instanceof。使用gorm方法而不是java关键字。

您可以在[解释] [1]中看到参考文档的这一部分。请参阅小节“懒惰单端关联和代理”

[1]:http://grails.org/doc/latest/guide/single.html#5.5.2.8急切和懒惰撷取

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() 
} 

如果最后一行打印“人体世界人”,那么,人类是不正确构建,它们都是人的情况下,而不是男/女。如果显示错误,那么它们是其他东西(如空值或其他东西)

祝你好运!

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()

+0

嗨,唐,谢谢,但我的收集不是空的。 – 2010-06-03 11:26:05

0

感谢您的帮助。我尝试你的测试。方法speak()返回预期结果。
对于男人回归“男人”,对于女人回报“女人”。
你的测试完成了,但我的麻烦总是在这里。

也许我忘了得到更多的信息:
此代码是从Grails项目。我的意思是这不重要。
正是我使用GORM电话:

def humans = Human.findAll() 

托马斯

1

与Hibernate的Grails是真的的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"} 
} 

汤姆

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

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

+0

嗨,彼得,我使用Grails 1.3.1。 – 2010-06-04 12:36:28

+0

请参阅Tiggerizzy在Grails 1.3中解决方案的答案。 – 2010-06-04 17:10:16