Как вы обнаружили, операторы равенства Котлина (==
и !=
) могут обрабатывать нули, а операторы сравнения заказов (<
, <=
, >
, >=
) не могут .
Это, вероятно, потому, что очевидно, что проверки на равенство должны означать для нулей - два нуля явно равны, а ненулевое значение никогда не должно равняться нулю - хотя не совсем понятно, что должно значит для сравнения заказов. (Если ноль не <0, значит ли это, что ноль> = 0? Если нет, у вас больше нет четко определенного порядка.)
Это отражено в реализации: Any
имеет метод equals()
, указывающий, что все объекты могут быть проверены на равенство. ( документация от Kotlin не делает этого явным, но для базового метода Java говорит , что ненулевые объекты никогда не должны равняться нулю.) И реализация Kotlin ==
и !=
операторы явно проверяют наличие нулей. (a == b
переводится на то, что вам нужно прописать в Java: a == null ? b == null : a.equals(b)
.)
Но сравнение заказов обрабатывается по-другому. Он использует интерфейс Comparable
: это реализуют только типы с «естественным упорядочением»; те, которые не, не могут быть сопоставлены таким образом. Поскольку null не может реализовывать какие-либо интерфейсы, он не может иметь естественного упорядочения, и компилятор не позволяет вам выполнить сравнение. (Опять же, документация от Kotlin не делает это явным, поскольку параметр не имеет значения NULL; но в документации для базового интерфейса Java говорится , что такое сравнение должно возвращать исключение NullPointerException. )
Что касается того, как вы должны справиться с этим, оператор Элвиса, вероятно, является наиболее кратким решением:
if (mouseEvent?.clickCount ?: 0 >= 2)
Если mouseEvent
не равно нулю, то получится clickCount
; в противном случае безопасный вызов ?.
выдаст ноль напрямую, а затем ?:
заменит 0. (Это также произойдет, если clickCount
будет содержать ноль, хотя это не должно быть возможно.) В любом случае , в результате вы получите целое число, не равное нулю, которое можно безопасно сравнить с 2.
Конечно, на практике ничто не должно вызывать метод слушателя и передавать нулевое событие. (Я не могу вспомнить, чтобы когда-либо позволял это возвращать, когда я писал для написания кода на Java Swing, или когда возникали какие-либо проблемы в результате.) Таким образом, более простой альтернативой может быть объявление параметра как обнуляемого. Но правильная обработка нуля просто немного безопаснее; и в этом случае он не добавляет много дополнительного кода. Так что решать вам!