Почему 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