Поместите ключ с именем metaClass в карту - PullRequest
2 голосов
/ 19 октября 2010

Я написал небольшой скрипт Groovy , который демонстрирует очень странное поведение.Кто-нибудь может это объяснить?

// Creating a groovy map 
def map = [:] 
// Putting a value in 
map["a"]="b"
// Render it without trouble 
println map["a"] 
// Putting another value in (yup, this one has THE name) 
map["metaClass"]="c"
// Failing to render it 
println map["metaClass"]

Мой вопрос в этом случае довольно прост: почему последняя инструкция выдает исключение ниже:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'c' with class 'java.lang.String' to class 'groovy.lang.MetaClass'
at Script1.run(Script1.groovy:8)

1 Ответ

4 голосов
/ 19 октября 2010

Проблема в том, что:

map["metaClass"]="c"

- это то же самое, что и запись:

map.metaClass = "c"

Я предполагаю, что перед делегированием методу Map.put(x,y) он проверяет, существует ли метод setXxxx на объекте.

Поскольку существует метод (в каждом объекте в Groovy) с именем setMetaClass(), он затем вызывает этот метод вместо установки свойства на карте (и не может привести "c" к объекту метакласса, как вы видели )

Обходные:

  • Нет ключа под названием metaClass
  • Используйте map.put( 'metaClass', 'c' ) вместо волшебной магии
...