2010-10-19 19 views
2

J'ai écrit un small Groovy script qui expose un comportement très étrange. quelqu'un peut-il l'expliquer?Mettez une clé nommée metaClass dans une carte

// 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"] 

Ma question dans ce cas est assez simple: pourquoi la dernière instruction va jeter l'exception ci-dessous:

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) 

Répondre

4

Le problème est que:

map["metaClass"]="c" 

est le même que écriture:

map.metaClass = "c" 

Je devine qu'avant de déléguer à la méthode Map.put(x,y), il vérifie si une méthode setXxxx existe sur l'objet.

Comme il existe une méthode (dans chaque objet Groovy) appelé setMetaClass(), il appelle cette méthode au lieu de définir la propriété sur la carte (et ne parvient pas à jeter "c" à un objet métaclasse, comme vous l'avez vu)

Solutions:

  • ne pas une clé appelée metaClass
  • Utiliser map.put('metaClass', 'c') au lieu de la magie groovy