私はオブジェクトにマップをキャストしようとしたところでコードを書いていました。GroovyのList to MapでClassCastExceptionがスローされたり、ArrayList1_groovyProxyはスローされません。
Map a = object as Map
私が代わりに
Map a = (Map) object
を使用することができますし、オブジェクトの型がリストであるが、前者を使用することによって、私は面白いことに遭遇した場合、これはClassCastException
をスローとして全体の問題は無関係になります。 オブジェクトがListの場合、つまり、object = []
の場合、groovy型の強制変換は、期待したものとは異なる動作をします。
私の期待はClassCastException
でしたが、結果として得られるオブジェクトが見つかりました。しかし、このオブジェクトは奇妙に見えます。これはListのインスタンスであり、Mapのインスタンスです。.toString()
を使用すると、Map([a,b]
)ではなくListが出力されます。また、a['c'] = 'c'
でマップに値を設定することはできません。これはjava.lang.IllegalArgumentException: argument type mismatch
になります。次の出力で
Map a = ['a', 'b'] as Map
println(a)
println(a instanceof List)
println(a instanceof Map)
println(a.getClass())
結果:
[a, b]
true
true
class ArrayList1_groovyProxy
私はこれArrayList1_groovyProxy
が何であるかを見つけるためにGoogleを試みたが、何かを見つけることができませんでした。
私には意味がありません。強制的には、明らかに実際にはそうでないオブジェクトが返され、ちょうどClassCastException
を投げるのではなく、壊れているように見えます。
例外をスローしてArrayList1_groovyProxy
の使用方法を説明するのではなく、その動作の背後にある理由を誰にも説明できますか?それとも、グルーヴィーのバグですか?
'['a'、 'b']'は 'リスト'です。マップが必要な場合は、 'def map = ['1': 'one'、 '2': 'two']'を定義します。今度は '' map instanceof Map'をアサートしようとしてください。 – Rao
'['a'、 'b']'がリストであることは知っています。それはポイントではなかった。その質問は、 '' ''、 'b' 'としてMap'が '(Map)[' a '、' b ']'のようにClassCastExceptionをスローしない理由でした。結果として生じるオブジェクトはかなり使用できないように思われるからです。 – alexanderfranke
わかりませんが、定義中に 'as Map'と言って強制しています。あなたは 'Map a = ['a'、 'b']' – Rao