2010-06-03 9 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() 확실히 반환 항목? –

+0

Grail 프로젝트에 있습니다.> Human.findAll() –

답변

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

인간 instanceof Man 대신 인간 human.instanceOf (Man)의 차이가 있음을 확인하십시오. java 키워드보다는 gorm 메소드를 사용하십시오.

[설명] [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() 
} 

마지막 줄에 인쇄 "인간 인간 인간", 그 인간이 제대로 구축되지 않은 경우, 그들은 대신에 사람의/여성 인간의 모든 인스턴스 . 오류가 표시되면 다른 것 (예 : null 또는 무언가)

행운을 빌어 요!

1

위의 코드에 아무 문제가 없으므로, Human.findAll()은 빈 컬렉션을 반환하므로 아무 것도 인쇄되지 않는 것으로 설명됩니다. 대신이 코드를 사용해 볼 수 있습니까?

class Human{...} 
class Man extends Human{...} 
class Women extends Human{...} 

println "You have ${Human.findAll().size()} humans" 

이 경우 "사용자가 0 명입니다."라고 표시되면 내 추측이 정확합니다. Human의 모든 인스턴스 목록을 보려면 Human.findAll()

+0

안녕하세요 Don, 감사합니다.하지만 내 컬렉션은 비어 있지 않습니다. –

0

대신에 Human.list()을 사용하는 것이 좋습니다. 나는 너의 시험을 시도해. 방법 speak() 결과가 예상됩니다.
남자 반환 "남자", 여자 반환 "여자"반환.
테스트가 끝났지 만 문제가 항상 발생합니다.
이 코드는 Grails의 프로젝트에서입니다 :

은 어쩌면 내가 더 많은 정보를 얻을 잊어 버렸습니다. 나는 그것이 중요하지 않다는 것을 의미한다.
는 정확히 내가 GORM 전화 사용 : 최대 절전 모드와 Grails에에

def humans = Human.findAll() 

토마스

1

정말 instanceof를 가진 문제입니다. 나는 다시 그것으로 문제가있다.

http://community.jboss.org/wiki/ProxyVisitorPattern

나는 문제가 클래스 일부 관계을 가지고 때 나타나는 것을 의미 :이 기사를 찾을 수 있습니다. 예를 들어 : Grails의 버전

0

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

톰? 난 그냥 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

Peter 안녕하세요. Grails 1.3.1을 사용합니다. –

+0

Grails 1.3의 솔루션에 대한 Tiggerizzy의 답변을 참조하십시오. –