2017-01-23 9 views
0

ではなく、のinstanceof条件を評価しようとすると、Groovy 2.4.7,1.6.0 JVM内で予期しなかった動作が検出されました。要約でGroovy "not instanceof"特異性

:私は、xがない整数のインスタンスしかしFoo.bar()がfalseを返しているので、Foo.bar()がtrueを返すだろうと予想するでしょう

class Foo {  
    static Boolean bar() { 
     String x = "Personally, I don't really like King Crimson" 
     return (!x instanceof Integer) 
    }  
} 

。これとは対照的に、次のtrueを返します:

class Foo {  
    static Boolean bar() { 
     String x = "Personally, I don't really like King Crimson" 
     return !(x instanceof Integer) 
    }  
} 

問題は学術的ですが、好奇心のうち:これは言語のバグであるか、私が動作するようになっているかinstanceofは誤解していますか?

(!x) instanceof Integer 

をだから、ブール(!'Hello'に文字列を変換しています文字列はいくつかのテキストが含まれているようfalseである:それは実際にチェックしていますので

それは operator precedenceの場合だ

答えて

1

...

!は、instanceof前に発生します

ブール値が整数のインスタンスであるかどうかを確認します(そうでない場合)

したがってfalse

あなたは(2番目のバージョンのように)括弧の外!を置く場合、それは最初のinstanceofを行い、その結果を否定し、あなたがに良い

+0

おかげで、期待する答えを与えます知っている。 –