我不熟悉常规并研究类型强制。
添加两个字节时会出现一些奇怪的操作。据我所知,groovy将两个字节的加法转换为整数。但如果有括号,它仍然是Byte。
assert (Byte)1 + (Byte)2 instanceof Integer
assert ((Byte)1 + (Byte)2) instanceof Byte
我在groovy 2.1.4上测试了它并且无法理解其中的差异。
感谢您的帮助。
答案 0 :(得分:2)
(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
根据to the documentation,Groovy编译器解析脚本并基于语法创建代码的AST表示。第一行被解析为ExpressionStatement
(特别是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时结束为真。我不确定这是不是一个bug ...我想在Groovy论坛上问我想。