2010-06-03 34 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