私はグルーヴィーで型強制を勉強しているのが初めてです。
2 バイト加算すると動作がおかしい。私の知る限り、groovy は 2 バイトの加算を整数として変換します。ただし、括弧がある場合は、Byte のままです。
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 表現を作成します。最初の行はExpressionStatement(具体的には a CastExpression) に解析されますが、2 行目は に解析されますAssertStatement。AssertStatementGroovy の AST には子がBooleanExpressionあり、括弧を明確にしないようです。これは、コードを解析する方法に影響を与えます... 2 つの行は次のようになります。
((1 + ((2) as Byte) instanceof Integer) as Byte)
assert ((1) as Byte) + ((2) as Byte) instanceof Integer : null
これが、アサートが実行され、他の結果が GroovyCastException になったときに true になる理由です。これがバグかどうかはわかりません... Groovy フォーラムで質問しようと思います。