2

非常に奇妙な動作を公開する小さな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)
4

1 に答える 1

4

問題はそれです:

map["metaClass"]="c"

書くことと同じです:

map.metaClass = "c"

メソッドに委任する前に、オブジェクトにメソッドが存在するMap.put(x,y)かどうかを確認していると思いsetXxxxます。

(Groovyのすべてのオブジェクトに)というsetMetaClass()メソッドがあるため、マップにプロパティを設定する代わりに、このメソッドを呼び出します(これ"c"まで見てきたように、metaClassオブジェクトへのキャストに失敗します)。

回避策:

  • と呼ばれるキーを持っていませんmetaClass
  • map.put( 'metaClass', 'c' )グルーヴィーな魔法の代わりに使う
于 2010-10-19T09:57:31.897 に答える