Я был Java разработчиком в течение многих лет, и недавно я нашел кое-что очень удивительное в Kotlin. В Java есть редко используемый логический оператор ^
XOR , но иногда это полезно. Например: вы можете легко проверить, больше ли одно и только одно из двух чисел больше нуля.
С оператором &&
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 все логические операторы (&,&&,|,||,^
) имеют меньший приоритет, чем реляционные операторы (>, >=, <, <=, ==, !=
). То же самое в Колтине, но, похоже, не для xor
. Таким образом, это происходит следующим образом:
a > 0
дает логическое значение boolean xor b > 0
, сначала оцененное как: boolean xor b
not b > 0
- И наконец мы получил ошибку компиляции, которая сказала:
The integer literal does not conform to the expected type Boolean
Вы можете проверить эту ситуацию здесь: XOR не работает хорошо
Один дополнительный случай: если вы думаете, что это: a > 0 xor (b > 0)
работает ... ну, нет. Еще одна ошибка компиляции: Type mismatch: inferred type is Boolean but Int was expected
Может кто-нибудь объяснить мне, есть ли какая-то намека на такие логи c или это просто ошибка в Kotlin языке?