比较类对象

我必须将类对象与预定义类的列表进行比较。 使用==是安全的还是我应该使用equals()?

if (klass == KlassA.class) { } else if (klass == KlassB.class) { } else if (klass == KlassC.class) { } else { } 

注意:我不能使用instanceof ,我没有对象,我只有.class对象。 我(错误)在这种情况下使用它就像一个枚举!

java.lang.Class 不会覆盖java.lang.Class 中的equals方法,它实现如下:

 public boolean equals(Object obj) { return (this == obj); } 

所以a == ba.equals(b)相同(除非a为null)。

对于大多数Java应用程序,这是正确的。 但是,如果两个类都由同一个类加载器加载,那么使用operator ==比较Java类是安全的。

我不确定这是否适用于您的具体情况,但您可以尝试Class.isAssignableFrom(Class) 。

 KlassA.class.isAssignableFrom(klass) 

这可能是安全的。

如果对象没有覆盖Equals方法,它将在引用之间进行比较。 如果两个变量指向同一个对象,则它们的引用匹配。

我更喜欢使用==来比较类对象和枚举常量,因为在类型不兼容的情况下会导致编译时错误。

例如:

 Class cls1 = Void.class; String cls2 = "java.lang.String"; if (cls1 == cls2) doSomething(); // Won't compile if (cls1.equals(cls2)) doSomething(); // Will compile 

如前面的答案所述,要比较Class类型(或java.lang.Class对象)的对象,我们应该使用==运算符。 但是,它可能有点混乱,因为通过==运算符的对象之间的比较结果总是不能导致正确的结果(我们通常使用equal()方法)。 例如,此表达式的结果为false:

 new String("book") == new String("book")//false 

原因是,

虚拟机管理每种类型的唯一Class对象 。 因此,您可以使用==运算符来比较java.lang.Class 对象 。 来自Core Java for the Impatient – 第153页

因此:

 new String("book").getClass() == new String("book").getClass()//true 

要么

 Class.forName("java.lang.String") == Class.forName("java.lang.String")//true 

结果是真的。