1

私はグルーヴィーで型強制を勉強しているのが初めてです。

2 バイト加算すると動作がおかしい。私の知る限り、groovy は 2 バイトの加算を整数として変換します。ただし、括弧がある場合は、Byte のままです。

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

Groovy 2.1.4 でテストしましたが、違いがわかりません。

事前に助けてくれてありがとう。

4

1 に答える 1

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

ドキュメントによると、Groovy コンパイラはスクリプトを解析し、文法に基づいてコードの AST 表現を作成します。最初の行はExpressionStatement(具体的には a CastExpression) に解析されますが、2 行目は に解析されますAssertStatementAssertStatementGroovy の AST には子がBooleanExpressionあり、括弧を明確にしないようです。これは、コードを解析する方法に影響を与えます... 2 つの行は次のようになります。

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

これが、アサートが実行され、他の結果が GroovyCastException になったときに true になる理由です。これがバグかどうかはわかりません... Groovy フォーラムで質問しようと思います。

于 2013-12-24T03:52:43.183 に答える