等値演算子を使用して 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実際に使用すると落とし穴があることを除きます。equalsnull
Class は equals をオーバーライドせず、Object を直接拡張します。この場合、equals と == は同じです。
いずれにせよ、ベスト プラクティスは、できる限り equals を使用することです。
== と equals の違いがわからない場合は、それについて読んでください。