使用相等运算符比较 Class 实例的陷阱是什么?
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
使用相等运算符比较 Class 实例的陷阱是什么?
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
真的没有陷阱;如果您期望实际行为,它的行为就像您期望的那样:) 此外,对象的equals()
方法Class
只是从继承的方法,它无论如何Object
都使用运算符。==
唯一令人惊讶的部分是,如果同一个类文件由两个不同的类加载器加载,您将获得两个单独的类对象,它们将比较为false
. 这是设计使然。
如果这些类是由不同ClassLoader
的 s 加载的,那么这些类可能来自同一个文件,但不是由同一个对象表示。在这种情况下,它们也可能具有不同的行为,因为其中一个加载器可能已经执行了字节码修改。
没有陷阱。Class
不会覆盖默认值Object.equals
,所以它是相同的语义,除了使用实际上会有一个陷阱,equals
因为左操作数null
会引发 NPE。
Class 不会直接覆盖 equals 和 extends Object,equals 和 == 在这种情况下是相同的。
无论如何,最佳实践是尽可能使用 equals。
如果您不知道 == 和 equals 之间的区别,请阅读它。
这样做可能更明智
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz.getName().equals(rootClazz.getName());
}
或某些版本,getName()
例如getSimpleName()