8

等値演算子を使用して Class インスタンスを比較する際の落とし穴は何ですか?

boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
    return clazz == rootClazz;
}
4

5 に答える 5

14

本当に落とし穴はありません。実際の動作を期待すれば、期待どおりに動作します:) さらに、オブジェクトのequals()メソッドClassは から継承されたものであり、とにかく演算子Objectを使用します。==

唯一の驚くべき部分は、同じクラス ファイルが 2 つの異なるクラス ローダーによってロードされた場合、false. これは仕様によるものです。

于 2012-07-25T10:31:13.843 に答える
3

クラスが異なる によってロードされた場合、クラスはClassLoader同じファイルからのものである可能性がありますが、同じオブジェクトによって表されていません。この状況では、ローダーの 1 つがバイトコードの変更を実行した可能性があるため、それらの動作も異なる可能性があります。

于 2012-07-25T10:31:43.737 に答える
1

落とし穴はありません。Classはデフォルトをオーバーライドしないため、同じセマンティクスですが、左のオペランドがNPE を引き起こすため、Object.equals実際に使用すると落とし穴があることを除きますequalsnull

于 2012-07-25T10:31:32.673 に答える
0

Class は equals をオーバーライドせず、Object を直接拡張します。この場合、equals と == は同じです。

いずれにせよ、ベスト プラクティスは、できる限り equals を使用することです。

== と equals の違いがわからない場合は、それについて読んでください。

于 2012-07-25T10:31:48.133 に答える