等値演算子を使用して Class インスタンスを比較する際の落とし穴は何ですか?
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
等値演算子を使用して Class インスタンスを比較する際の落とし穴は何ですか?
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
本当に落とし穴はありません。実際の動作を期待すれば、期待どおりに動作します:) さらに、オブジェクトのequals()
メソッドClass
は から継承されたものであり、とにかく演算子Object
を使用します。==
唯一の驚くべき部分は、同じクラス ファイルが 2 つの異なるクラス ローダーによってロードされた場合、false
. これは仕様によるものです。
クラスが異なる によってロードされた場合、クラスはClassLoader
同じファイルからのものである可能性がありますが、同じオブジェクトによって表されていません。この状況では、ローダーの 1 つがバイトコードの変更を実行した可能性があるため、それらの動作も異なる可能性があります。
落とし穴はありません。Class
はデフォルトをオーバーライドしないため、同じセマンティクスですが、左のオペランドがNPE を引き起こすため、Object.equals
実際に使用すると落とし穴があることを除きます。equals
null
Class は equals をオーバーライドせず、Object を直接拡張します。この場合、equals と == は同じです。
いずれにせよ、ベスト プラクティスは、できる限り equals を使用することです。
== と equals の違いがわからない場合は、それについて読んでください。