Конфликт между GroovyTruth и неявным конструктором

Я заметил некоторый конфликт между неявным конструктором и GroovyTruth.

Рассмотрим следующий код

assert new File('/') == ['/'] as File
assert Boolean.TRUE == ["false"] as Boolean

Первая строка — неявный вызов конструктора File(String). Вторая строка просто возвращает true, потому что список не пуст. Но он может (должен?) вызывать логический (String) конструктор с другим значением результата (false).

Это ошибка, задокументированная функция или что-то еще? еще? Должен ли я сообщить об этом как об ошибке?


person Seagull    schedule 12.11.2013    source источник


Ответы (1)


Когда вы делаете:

['false'] as Boolean

В итоге он проходит через DefaultTypeTransformation.castToType, который вызывает castToBoolean, который как вы можете видеть проверяет null, затем вызывает asBoolean для типа Collection, который просто проверяет, что он не пустой

В примере File он проваливается до конца castToType и просто пытается вызвать конструктор с содержимым списка

Я бы не сказал, что это ошибка, но это определенно идиосинкразия Groovy, которую необходимо учитывать (и изменение ее сейчас было бы серьезным нарушением совместимости).

person tim_yates    schedule 12.11.2013
comment
Спасибо за ссылку на источник! Я могу понять, что там происходит, но источник - лучшее подтверждение. Очень интересно, я просто забыл, что ядро ​​Groovy открыто! Вопрос был о существовании двух практически одинаковых строк кода с совершенно разным поведением. Если я увижу страницу документации об этом, я укажу это там. - person Seagull; 13.11.2013
comment
@Seagull Не беспокойтесь :-) Рад, что смог помочь! - person tim_yates; 13.11.2013
comment
Помните, что org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation — это файл реализации Codehaus Groovy, а не часть языка Groovy, поэтому другие реализации Groovy могут обрабатывать такие особенности по-разному, например, рассматривать их как ошибки. - person Vorg van Geir; 15.11.2013
comment
К счастью, в настоящее время нет других реализаций Groovy, и любая стоящая реализация должна следовать правилам Groovy Truth (именно в этом и заключается суть). Так что это немного пустой аргумент - person tim_yates; 15.11.2013