2014-10-23 5 views
3

я написал кусок кода, где я проверяю размер в ArrayList, как:Groovy имеет свою недвижимость для коллекционирования?

[1,2,3].size 

Все хорошо работает на Groovy консоли и с Grails встроенного Tomcat сервером. Но как только я разворачивал этот код на WebSphere Application Server, я receivec исключение с указанием

Exception evaluating property 'size' for java.util.ArrayList, Reason: groovy.lang.MissingPropertyException: No such property: size for class: java.lang.Integer. 

Через некоторое время отладки, тестирования и много WTFs, я понял, что там были круглые скобки отсутствуют в вызове метода. Обозначение свойства не должно работать, поскольку нет метода getSize() для коллекции (это просто size()), и все это имеет смысл.

Что меня озадачивает Почему someCollection.size работает на Groovy Console и Grails?

Grails и Groovy Console версии 2.3.6

+0

Существуют ли варианты отличительных черт? – Opal

+0

'ArrayList' имеет частный var' размер' (по крайней мере, на солнце jdk 1.7u67). Я ожидал бы разных JDK. – cfrick

+0

Рамка Grails входит в состав приложения, так что это то же самое для обоих. Различные JDK - очень хороший кандидат. У Websphere, вероятно, есть своя реализация. – kaskelotti

ответ

4
ArrayList

в (по крайней мере) Sun JDK 1.7u67 и OpenJDK 1.6 держит private int size, которая доступна для заводной. Если в вашей другой среде используется другой JDK, этот var может не существовать, и groovy будет возвращаться к интерпретации [1,2,3]*.getSize(), которая затем терпит неудачу.

+1

Реализация ArrayList, где этот код не работает, действительно не имеет переменной-члена размера. – kaskelotti

Смежные вопросы