使用相等运算符比较两个类

时间:2012-07-25 10:27:21

标签: java

使用等号运算符比较Class实例有哪些缺陷?

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

5 个答案:

答案 0 :(得分:13)

确实没有陷阱;如果您期望实际行为,它的行为就像您期望的那样:)此外,equals()对象的Class方法只是来自Object的继承方法,它使用==无论如何,1}}运算符。

唯一令人惊讶的部分是,如果同一个类文件由两个不同的类加载器加载,您将获得两个单独的类对象,它们将比较为false。这是设计的。

答案 1 :(得分:3)

如果类由不同的ClassLoader加载,则类可能来自同一文件,但不是由同一对象表示。在这种情况下,它们也可能具有不同的行为,因为其中一个加载器可能已执行字节码修改。

答案 2 :(得分:1)

没有陷阱。 Class不会覆盖默认的Object.equals,因此它的语义相同,只是实际上成为使用equals的陷阱,因为左操作数为{ {1}}将挑起NPE。

答案 3 :(得分:0)

Class不会覆盖equals并直接扩展Object,在这种情况下equals和==是相同的。

无论如何,最好的做法是尽可能使用equals。

如果你不知道==和equals之间的差异,请阅读它。

答案 4 :(得分:-1)

做起来可能更明智

boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
    return clazz.getName().equals(rootClazz.getName());
}

或某些版本的getName(),例如getSimpleName()