带括号的groovy类型强制
我是groovy新手,正在研究类型强制 添加两个字节时会出现一些奇怪的操作。据我所知,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
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,你的回答真的很有帮助。