比较类对象
我必须将类对象与预定义类的列表进行比较。 使用==是安全的还是我应该使用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 == b
与a.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
结果是真的。
- 如何发送请求标题是“内容类型”:“应用程序/ json”在排球时获取
- 例外:android.view.InflateException:二进制XML文件行#20:错误膨胀类net.simonvt.datepicker.DatePicker
- Firebase实时数据库跟踪更改
- 判断字符串是否为有效日期的最快方法
- Chrome错误:您使用的是不受支持的命令行标志: – ignore-certifcate-errors。 稳定性和安全性将受到影响
- 什么是Java中的序列化?
- Android通知不会发出声音或振动
- 在小行星类型游戏中正确运动
- Android上的YouTube客户端有java.lang.NullPointerException