2014-07-22 79 views
2

雖然我正在編輯groovy.lang.Range帶下標運算符我有一個​​錯誤java.lang.UnsupportedOperationExceptionjava.util.List一切正常。 Groovy Range API沒有跡象表明集合是不可變的。你有什麼想法有什麼問題與我的代碼的Range \?Range爲什麼拋出UnsupportedOperationException?

的代碼如下:

def list = "a".."c" 
assert list instanceof java.util.List 
assert list.size() == 3 
list[2] = "d" 

控制檯輸出:

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.set(AbstractList.java:132) 
at org.codehaus.groovy.runtime.DefaultGroovyMethods.putAt(DefaultGroovyMethods.java:6607) <6 internal calls> 
    at Hello.run(Hello.groovy:4) <15 internal calls> 
    at Hello.main(Hello.groovy) <5 internal calls> 

更新

Groovy的版本:1.8.6 JVM:1.6.0_45賣方:太陽微系統公司Inc.操作系統:Linux

+2

'java.util.List'是一個*接口*。範圍可能不會實現所有的方法。 – Opal

+1

[範圍'不支持'set'](https://github.com/groovy/groovy-core/blob/GROOVY_1_8_X/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java#L6609) 。爲了實現這一點,使用'('a'..'c')。toList()'將範圍(在本例中爲ObjectRange)轉換爲列表。有關詳細信息,請參閱AbstractList http://docs.oracle.com/javase/7/docs/api/java/util/AbstractList.html#set(int,%20E)。 – dmahapatro

+0

你確定這個班是打算可變的嗎? –

回答

1

它看起來像那個gro ovy使用ObjectRange。在文檔中,您可以看到它繼承了java.util.AbstractList的add方法,該方法引發了UnsupportedOperation異常。

相關問題