我必须将Class
对象与预定义类列表进行比较。
使用==
是否安全或我应该使用equals
?
if (klass == KlassA.class) {
} else if (klass == KlassB.class) {
} else if (klass == KlassC.class) {
} else {
}
注意:我无法使用instanceof
,我没有对象,我只有Class
对象。我(错误)在这种情况下使用它就像一个枚举!
答案 0 :(得分:27)
java.lang.Class
does not覆盖equals
的{{1}}方法,其实现方式如下:
java.lang.Object
因此public boolean equals(Object obj) {
return (this == obj);
}
与a == b
相同(除非a.equals(b)
为空)。
答案 1 :(得分:3)
对于大多数Java应用程序而言,这是正确的。但是,如果两个类都由同一个类加载器加载,那么使用operator ==比较Java类是安全的。
答案 2 :(得分:2)
我不确定这是否适用于您的具体情况,但您可以尝试Class.isAssignableFrom(Class)。
KlassA.class.isAssignableFrom(klass)
答案 3 :(得分:1)
这可能是安全的。
如果对象没有覆盖Equals
方法,它将在引用之间进行比较。如果两个变量指向同一个对象,则它们的引用匹配。
答案 4 :(得分:0)
我更喜欢使用==来比较类对象和枚举常量,因为在类型不兼容的情况下会导致编译时错误。
例如:
Class<?> cls1 = Void.class;
String cls2 = "java.lang.String";
if (cls1 == cls2) doSomething(); // Won't compile
if (cls1.equals(cls2)) doSomething(); // Will compile
答案 5 :(得分:0)
如前面的答案所述,要比较Class类型(或java.lang.Class对象)的对象,我们应该使用==运算符。但是,它可能有点令人困惑,因为通过==运算符的对象之间的比较结果总是不能导致正确的结果(我们通常使用equal()方法)。例如,此表达式的结果为false:
new String("book") == new String("book")//false
原因是,
虚拟机管理每种类型的唯一Class对象。 因此,您可以使用==运算符来比较java.lang.Class 的物体即可。来自Core Java for the Impatient - Page 153
因此:
new String("book").getClass() == new String("book").getClass()//true
或
Class.forName("java.lang.String") == Class.forName("java.lang.String")//true
结果为真。