使用等号运算符比较Class实例有哪些缺陷?
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
答案 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()