私は長年Java開発者でしたが、最近Kotlinで非常に驚くべきものを見つけました。Javaには、めったに使用されない論理演算子^
があります[〜#〜] xor [〜#〜]が便利な場合があります。たとえば、2つの数値のうち1つだけがゼロより大きい。
&&
[〜#〜] and [〜#〜]演算子といくつかの変数a
およびb
を使用すると、そのように:
boolean valid = (a > 0 && b <= 0) || (a <= 0 && b > 0);
しかし、それは^
[〜#〜] xor [〜#〜]で簡単に達成できます:
boolean valid = a > 0 ^ b > 0;
Kotlineでは、^
を[〜#〜] xor [〜#〜]として使用せず、xor
とKotlinの同じコードは次のようになります。
val valid = a > 0 xor b > 0;
Kotlineのこのコードでは...コンパイルエラーが発生するため、問題が発生します。どうして?なぜならJavaすべての論理演算子(&,&&,|,||,^
)は、関係演算子(>, >=, <, <=, ==, !=
)よりも優先順位が低いためです。Koltinと同じですが、xor
には似ていないため、次のようになります。
a > 0
はブール値を与えるboolean xor b > 0
最初に明らかにされたもの:boolean xor b
b > 0
ではないThe integer literal does not conform to the expected type Boolean
この状況をここで確認できます: XORがうまく機能していません
もう1つのケース:これが機能すると思われる場合:a > 0 xor (b > 0)
が機能します...まあ、違います。別のコンパイルエラー:Type mismatch: inferred type is Boolean but Int was expected
そのようなロジックの目的はあるのか、それともKotlin言語の単なるバグなのか、誰かが私に説明できますか?