(Byte)1 + (Byte)2
приведет к типу байта, независимо от скобки.
(Byte)1 + (Byte)2 instanceof Integer
сбой, поскольку он сначала оценил бы «2 экземпляра целого числа» в true, а затем попытался применить true к байту, в результате чего возникло исключение.
ОБНОВЛЕНИЕ 1/1/2014: Я внимательно посмотрел, так как это правильный вопрос относительно того, почему утверждение также не вызывает ошибку приведения, вот что я нашел. Учитывая этот сценарий:
(Byte)1+(Byte)2 instanceof Integer
assert (Byte)1+(Byte)2 instanceof Integer
Согласно to the documentation, то Groovy компилятор анализирует сценарий и создает AST представление кода на основе грамматики. Первая строка анализируется на ExpressionStatement
(в частности, CastExpression
), но вторая строка анализируется на AssertStatement
. AssertStatement
в AST Groovy, имеет BooleanExpression
ребенка и, кажется, не прояснив скобку, это влияет, как он решает разобрать код ... две строки в конечном итоге выглядит так:
((1 + ((2) as Byte) instanceof Integer) as Byte)
assert ((1) as Byte) + ((2) as Byte) instanceof Integer : null
Вот почему работает утверждают, и заканчивается тем, что выполняется, когда другой результат в GroovyCastException. Я не уверен, что это ошибка или нет ... Я собираюсь спросить на форуме Groovy, я думаю.
Как сказал @chrixian, компиляция '(Byte) 1 + (Byte) 2 instanceof Integer' не удалась. Но я все еще не могу понять, почему 'assert (Byte) 1+ (Byte) 2 instanceof Integer' работает без проблем. – geekslife
Я обновил свой ответ более подробно. Я обновлю, если узнаю больше о том, почему это происходит. – chrixian
Спасибо @chrixian, ваш ответ был действительно полезен. – geekslife