2013-12-24 7 views
1

Я новичок в изумлении и изучении типа принуждения.принудительное принуждение типа с круглыми скобками

Есть несколько странных операций при добавлении двух байтов. Насколько мне известно, groovy преобразует добавление двух байтов как integer. Но если есть круглые скобки, он все равно остается байтом.

assert (Byte)1 + (Byte)2 instanceof Integer 
assert ((Byte)1 + (Byte)2) instanceof Byte 

Я тестировал его на groovy 2.1.4 и не могу понять разницу.

Спасибо за помощь заранее.

ответ

2

(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, я думаю.

+0

Как сказал @chrixian, компиляция '(Byte) 1 + (Byte) 2 instanceof Integer' не удалась. Но я все еще не могу понять, почему 'assert (Byte) 1+ (Byte) 2 instanceof Integer' работает без проблем. – geekslife

+0

Я обновил свой ответ более подробно. Я обновлю, если узнаю больше о том, почему это происходит. – chrixian

+0

Спасибо @chrixian, ваш ответ был действительно полезен. – geekslife