本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>
提问:如何获取对象所属的类?
如果类B
和类C
都继承了类A
。现在我有一个类型为B
或C
的对象,我如何确定这个实例是什么类的对象。
回答一
- 直接判断类型
if (obj instanceof C) {
//your code
}
复制代码
- 获取对象所属类
Object.getClass()
复制代码
回答二
广大的大佬们给出了很多办法,但是仍然有更多的办法:
Class.isAssignableFrom()
- 简单的尝试强制转换对象,可能会引发
ClassCastException
错误
我总结了所有可用的方法
让我们测试一下判断Object obj
是否是C
类型实例的可能方法:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
复制代码
对于null的不同处理方式
在前两个方法中,如果obj
为null
,表达式的计算结果为false
(null
不是任何对象的实例,但可以强转成任何类型)。
第三个方法显然会抛出NullPointerException
。
相反,第4和第5个方法接收null
,因为null
可以转换为任何类型!
注意:null
不是任何类型的实例,但它可以转换为任何类型。
不应该使用Class.getName()
执行is instance of
测试,因为对象如果不是C
类型而是它的子类,则它可能具有完全不同的名称和包名,但它仍然是C
类型。
回答三
大佬们提出了很多方法,但是我认为导致这个问题出现的原因是由于OOP
的恶臭设计。
如果你的代码设计很好,你应该是不需要使用getClass()
或者instanceof
的
任何一种建议的方法都可以,但是要记住,设计也很重要。
文章翻译自Stack Overflow:stackoverflow.com/questions/5…
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END