如果我喜歡寫東西def l = [1, 2, 3] as Socket
這顯然是無稽之談,我得到這個:Groovy的高清L = [1,2,3]的BlockingQueue
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[1, 2, 3]' with class 'java.util.ArrayList' to class 'java.net.Socket'
這是有道理的。
現在我嘗試不太喜歡冒險的東西:
import java.util.concurrent.BlockingQueue
def l = [1, 2, 3] as BlockingQueue
println l.class
println l
這並不拋出異常,並打印出以下幾點:
class ArrayList1_groovyProxy
[1, 2, 3]
那麼什麼是ArrayList1_groovyProxy
,爲什麼我能夠投中列表到BlockingQueue
沒有錯誤,儘管它失敗(l
不會最終是一個BlockingQueue
實例)?
編輯:
所有的- 首先,我想指出的是,
def l = [1, 2, 3] as List
效果很好,儘管事實上,這兩個List
和BlockingQueue
是接口產生的ArrayList
一個regualr實例。 二,後Dónal's的答案,我試過如下:
def l = [1, 2, 3] as BlockingQueue assert l instanceof BlockingQueue println l.class println l
該印刷以下行並沒有斷言異常被拋出:
class ArrayList1_groovyProxy [1, 2, 3]
不過,此行也拋出
MissingMethodException
:l.offer(5)
所以斷言不知何故成功,但嘗試使用
l
作爲BlockingQueue引發異常。第三,同樣的情況,如果我嘗試
def l = [1, 2, 3] as Map
此代碼:def l = [1, 2, 3] as Map assert l instanceof Map println l println l.getClass()
不產生錯誤和打印:
[1, 2, 3] class ArrayList1_groovyProxy
這種「可愛」有多常見?安靜地失敗會導致骯髒,難以發現錯誤。 – Malt