使用等号运算符比较类实例有哪些陷阱?
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz == rootClazz;
}
没有真正的陷阱; 它的行为就像您所期望的那样,如果您期望实际行为 :) 另外,Class
对象的equals()
方法只是从Object
继承的方法,它使用==
运算符。
唯一令人惊讶的部分是,如果同一类文件被两个不同的类加载器加载,则会得到两个单独的类对象,这些对象将比较为false
。 这是设计上的考虑。
ClassLoader
加载的,则这些类可能来自同一文件,但并非由同一对象表示。在这种情况下,它们也可能具有不同的行为,因为其中一个加载器可能已经执行了字节码修改。没有陷阱。Class
没有覆盖默认的Object.equals
,因此语义相同,只是使用equals
会有一个陷阱,因为左操作数为null
将引发NPE。
该类没有重写equals方法,并且直接扩展了Object类,因此在这种情况下equals和==是相同的。
尽管如此,在可能的情况下最好使用equals方法。
如果您不知道==和equals方法之间的区别,请去了解一下。
也许更明智的做法是
boolean compareTypes(Class<?> clazz, Class<?> rootClazz) {
return clazz.getName().equals(rootClazz.getName());
}
或者一些类似于getName()
的版本,例如getSimpleName()
getSimpleName
在不同包中名称相同的类中会出现问题。 - Sayo Oladeji
false
是完全正确的。 - Marko Topolnik