8

使用相等运算符比较 Class 实例的陷阱是什么?

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

5 回答 5

14

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

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

于 2012-07-25T10:31:13.843 回答
3

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

于 2012-07-25T10:31:43.737 回答
1

没有陷阱。Class不会覆盖默认值Object.equals,所以它是相同的语义,除了使用实际上会有一个陷阱,equals因为左操作数null会引发 NPE。

于 2012-07-25T10:31:32.673 回答
0

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

无论如何,最佳实践是尽可能使用 equals。

如果您不知道 == 和 equals 之间的区别,请阅读它。

于 2012-07-25T10:31:48.133 回答
-1

这样做可能更明智

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

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

于 2014-05-22T18:44:54.890 回答