Kotlin:null許容型では同等の比較は問題ないようですが、比較よりも大きい場合は問題ありません



Kotlin Equal Comparison Seems Ok Nullable



解決:

お気づきのとおり、Kotlinの等式演算子(==および!=)はnullを処理できますが、順序比較演算子(<, <=, >、> =)できません。

これはおそらく、同等性チェックが何をすべきかが明らかであるためです。 平均 nullの場合— 2つのnullは明らかに等しく、null以外の値がnullと等しくなることはありません—ただし、順序の比較で何を意味するのかはまったく明確ではありません。 (nullが0でない場合は?そうでない場合は、明確に定義された順序がなくなります。)



これは実装に反映されています。いずれかがありますequals()メソッド。これは、すべてのオブジェクトが等しいかどうかをチェックできることを示します。 (Kotlinのドキュメントでは、基盤となるJavaメソッドの場合と同様に、null以外のオブジェクトがnullと等しくなることはないことを明示しています。)そして、Kotlinの実装==および!=演算子は明示的にnullをチェックします。 ((a == bは、Javaで綴る必要があるものに変換されます。a == null? b == null:a.equals(b))

ただし、順序の比較は別の方法で処理されます。それは使用します同等のインターフェース:「自然な順序」を持つタイプのみがそれを実装します。そうでないものは、そのように比較することはできません。 nullはインターフェースを実装できないため、自然な順序を設定することはできず、コンパイラーは比較を試みることを防ぎます。 (Kotlinのドキュメントでは、パラメーターがnull可能ではないため、これを明示していません。ただし、基盤となるJavaインターフェイスの場合、このような比較ではNullPointerExceptionが返されるはずです。)



これをどのように処理するかについては、エルビス演算子がおそらく最も簡潔な解決策です。

if(mouseEvent?.clickCount?:0> = 2)

もしもmouseEventがnullではない場合、これはclickCount;それ以外の場合、セーフコール?。直接nullを与え、次に?:0に置き換えます(これは、clickCountはnullのままですが、それは不可能です。)いずれの場合も、2と安全に比較できるnull不可能な整数になります。

もちろん、実際には、リスナーメソッドを呼び出してnullイベントを渡すものはありません。 (私が生計を立てるためにJava Swingコードを書いていたとき、または結果として問題が発生したときに、それを元に戻したことを思い出せません。)したがって、より簡単な代替手段は、パラメーターをnull不可として宣言することです。ただし、nullを適切に処理する方が、少しだけ安全です。この場合、余分なコードはあまり追加されません。だからそれはあなた次第です!