Почему groovy.class возвращает другое значение, чем .getClass()
Согласно http://groovy.codehaus.org/Things+you+can+do+but+better+leave+undone
- Доступ к типу объекта, например свойства
Использование .class вместо .getClass() в порядке - пока вы знаете точно, какой у вас объект. Но тогда вам это не нужно все. В противном случае вы рискуете получить нуль или что-то еще, но не класс объекта.
a = [:] println a.class.simpleName//NullPointerException, потому что a.class имеет значение null.
Может кто-нибудь объяснить, почему это? Почему .class
возвращает что-то другое, чем getClass()
Ответы
Ответ 1
Потому что, когда a
- это карта, a.class
совпадает с Groovy как a.get( "class" )
. Как вы можете видеть в примере в документах, это вернет null. Вот почему тренд правил должен состоять в использовании getClass, если вы не уверены, что переменная не будет отображаться на карте
Ответ 2
Пример без карты - это разница между классом типа и классом экземпляра.
Класс .class и .getClass() экземпляра - это его тип, за некоторыми исключениями, например. карты.
Класс типа - это тип.
Тип .getClass() типа - это java.lang.Class
Например:
def a = Integer.getClass()
def b = Integer.class
def c = 1.getClass()
def d = 1.class
println a
println b
println c
println d
даст результат:
class java.lang.Class
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer