2010-06-03 15 views
6

Koleksiyondaki Nesne sınıfı türü nasıl belirlenir?Grails'te 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" } 
} 

Çok teşekkürler, bu çalışması gerekir gibi gözüküyor
Tom

+0

humanService.all() kesinlikle iade mi girişleri? –

+0

Bu Grail projesinde, Ben> Human.findAll() –

cevap

15

Açıklamanıza bağlı olarak, hazırda beklemeli proxy nesnelerine çalıştığınızı söyleyebilirim (örn. Sınıf adı: Human _ $$ javaassist *). Çözüm, insatnceOf'un GORM tarafından sağlanan sürümünü kullanmak olacaktır. İsteyerek almak veya farklı bir yöntem kullanmak için gerek yok.

def planet = Planet.get(1) 
planet.humans.each(){ human -> 
    if (human.instanceOf(Man)) { println "is Man"} 
    if (human.instanceOf(Woman)) { println "is Woman"} 
} 

İnsanın instanceof Man yerine insan.instanceOf (fark) farkına dikkat edin. Java anahtar sözcüğü yerine gorm yöntemini kullanın.

[explanation] [1] için referans belgelerin bu bölümünü görebilirsiniz. alt bölüm "Tembel Dernekleri ve Proxies'i Tek Uçlu" bölümüne bakın

[1]: http://grails.org/doc/latest/guide/single.html#5.5.2.8 getiriliyor Hevesli ve Tembel

4

.

Birkaç rastgele düşünce: İnsanlarınız doğru bir şekilde inşa edilmiş mi? Belki de gerçekten insan ya da kadın örnekleri değildir.

Sen polimorfizmi kullanarak bazı testler yapabilirsiniz:

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

son satırı baskılar "İnsan İnsan İnsan", daha sonra insanlar doğru inşa değilseniz ve bunlar yerine Man/Woman tüm insan örnekleri olan . Bir hata gösterirse, o zaman başka bir şey vardır (null veya başka bir şey gibi)

İyi şanslar!

1

Yukarıdaki kodda bir sorun yok, bu yüzden tahminim Human.findAll() boş bir koleksiyona dönüyor, bu da neden hiçbir şeyin yazdırılmayacağını açıklıyor. Bunun yerine bu kodu deneyebilir misin?

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

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

Bu "0 kişiniz var" yazıyorsa, tahminim doğrudur. Human'un tüm örneklerinin bir listesini almak istiyorsanız, Human.list() yerine Human.findAll()

+0

Merhaba Don, teşekkürler, ama benim koleksiyonum boş değil. –

0

yardımlarınız için teşekkür ederiz. Testini deniyorum. Yöntem speak() beklenen sonuçları döndür.
İnsan için "Erkek" iadesi için, Kadın için "Kadın" değerini döndür.
Testiniz tamamlandı, ama benim sorunum her zaman burada.
Bu kod Grails proje şöyledir:

Belki daha fazla bilgi almak unuttum. Yani bu önemli değil.
Tam ben Gorm çağrısı kullanın: hazırda ile Grails

def humans = Human.findAll() 

Tomas

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

Tom? Bunu sadece Grails 1.2.2 konsolunda denedim ve şu şekilde çalışıyor:

Belki de düzeltilmiş bir sorun mu var?

+0

Merhaba Peter, Grails 1.3.1 kullanıyorum. –

+0

Grails 1.3'deki bir çözüm için Tiggerizzy'nin cevabına bakın. –

İlgili konular