instanceof в Граале - PullRequest
       9

instanceof в Граале

6 голосов
/ 03 июня 2010

Как определить тип класса Object в коллекции?

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 ]

15 голосов
/ 04 июня 2010

Исходя из вашего описания, я бы сказал, что вы работаете с прокси-объектами 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"}
}

Обратите внимание на разницу между человеком и человеком, а не человеком. Используйте метод gorm, а не ключевое слово java.

Вы можете увидеть этот раздел справочной документации для [объяснения] [1]. См. Подраздел «Ленивые однокомпонентные ассоциации и прокси»

[1]: http://grails.org/doc/latest/guide/single.html#5.5.2.8 Стремительное и ленивое извлечение

4 голосов
/ 03 июня 2010

Похоже, что должно работать.

Пара случайных мыслей: правильно ли построены ваши люди? Может быть, они на самом деле не являются экземплярами мужчины или женщины.

Вы можете сделать несколько тестов, используя полиморфизм:

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 голос
/ 04 июня 2010

в Grails с 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"}
}

Tom

1 голос
/ 03 июня 2010

Нет ничего плохого в приведенном выше коде, поэтому я предполагаю, что 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 голосов
/ 04 июня 2010

Какая версия 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 голосов
/ 03 июня 2010

благодарю за помощь. Я пробую твой тест. Метод speak () возвращает ожидаемые результаты.
Для мужчины вернуть «Мужчина», для женщины вернуть «Женщина».
Ваш тест закончен хорошо, но моя проблема всегда здесь.

Может быть, я забыл получить больше информации:
Этот код взят из проекта Grails . Я имею в виду, что это не важно.
Именно я использую GORM вызов:

def humans = Human.findAll() 

Томас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...