带括号的groovy类型强制

带括号的groovy类型强制,groovy,coercion,Groovy,Coercion,我是groovy新手,正在研究类型强制 添加两个字节时会出现一些奇怪的操作。据我所知,groovy将两个字节的加法转换为整数。但如果有括号,它仍然是字节 assert (Byte)1 + (Byte)2 instanceof Integer assert ((Byte)1 + (Byte)2) instanceof Byte 我在groovy 2.1.4上测试了它,但无法理解其中的区别 提前感谢您的帮助。(Byte)1+(Byte)2将生成字节类型,而不考虑括号 (Byte)1+(Byte)2

我是groovy新手,正在研究类型强制

添加两个字节时会出现一些奇怪的操作。据我所知,groovy将两个字节的加法转换为整数。但如果有括号,它仍然是字节

assert (Byte)1 + (Byte)2 instanceof Integer
assert ((Byte)1 + (Byte)2) instanceof Byte
我在groovy 2.1.4上测试了它,但无法理解其中的区别

提前感谢您的帮助。

(Byte)1+(Byte)2
将生成字节类型,而不考虑括号

(Byte)1+(Byte)2 instanceof Integer
失败,因为它首先将“2 instanceof Integer”求值为true,然后尝试将true强制转换为Byte,从而导致强制转换异常

2014年1月1日更新:我仔细研究了一下,因为这是一个关于为什么断言不会产生强制转换错误的有效问题,下面是我的发现。鉴于此脚本:

(Byte)1+(Byte)2 instanceof Integer
assert (Byte)1+(Byte)2 instanceof Integer
根据这个例子,Groovy编译器解析脚本并基于语法创建代码的AST表示。第一行被解析为
表达式语句
(具体地说是
CastExpression
),但第二行被解析为
AssertStatement
。Groovy的AST中的
AssertStatement
有一个
BooleanExpression
子级,而且似乎没有明确的括号,这会影响它决定如何解析代码。。。这两条线的结尾是这样的:

((1 + ((2) as Byte) instanceof Integer) as Byte)
assert ((1) as Byte) + ((2) as Byte) instanceof Integer : null

这就是为什么当另一个断言导致GroovyCastException时,该断言运行并最终为true。我不确定这是不是一个错误。。。我想我会在Groovy论坛上提问。

正如@chrixian所说,编译整数的
(Byte)1+(Byte)2实例失败了。但我仍然无法理解为什么整数的
断言(字节)1+(字节)2实例运行没有问题。如果我发现更多关于这种行为发生的原因,我会更新。谢谢@chrixian,你的回答真的很有帮助。