带括号的常规类型强制

时间:2013-12-24 02:42:21

标签: groovy coercion

我不熟悉常规并研究类型强制。

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

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

我在groovy 2.1.4上测试了它并且无法理解其中的差异。

感谢您的帮助。

1 个答案:

答案 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论坛上问我想。