instanceof в Grails

Как определить Тип класса Объекта в наборе?

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

Большое спасибо,
Tom

6
задан Tomáš 4 June 2010 в 08:23
поделиться

6 ответов

Основываясь на вашем описании, я бы сказал, что вы работаете с прокси-объектами Hibernate (т.е. имя класса: Human _ $$ javaassist *). Решением было бы использовать версию insatnceOf, предоставленную GORM. Не нужно торопиться получать или использовать другой метод.

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 Активная и отложенная выборка

16
ответ дан 8 December 2019 в 05:53
поделиться

благодарю за вашу помощь. Пробую твой тест. Метод speak () возвращает ожидаемые результаты.
Для мужчины верните "Man", для женщины верните "Woman".
Ваш тест закончился нормально, но моя проблема всегда здесь.

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

def humans = Human.findAll() 

Томас

0
ответ дан 8 December 2019 в 05:53
поделиться

В приведенном выше коде все в порядке, поэтому я предполагаю, что 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()

1
ответ дан 8 December 2019 в 05:53
поделиться

Какая версия 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
ответ дан 8 December 2019 в 05:53
поделиться

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

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

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

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

Если в последней строке написано «Человек Человек Человек», то люди построены неправильно, и все они являются человеческими экземплярами, а не мужчинами / женщинами. Если он показывает ошибку, значит, это что-то еще (например, нули или что-то в этом роде)

Удачи!

4
ответ дан 8 December 2019 в 05:53
поделиться

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

Том

1
ответ дан 8 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: