如果类B和类C扩展了类A,我有一个类型为B或C的对象,我如何确定它是哪种类型的实例?
当前回答
如果你想在运行时知道,用isinstance()检查是不够的。 使用:
if(someObject.getClass().equals(C.class){
// do something
}
其他回答
我在我的GeneralUtils类中使用blow函数,检查它可能有用
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
任何建议的方法的使用都被认为是基于糟糕的OO设计的代码气味。
如果您的设计很好,您应该不会发现自己需要使用getClass()或instanceof。
任何建议的方法都可以,但只是在设计方面要记住一些东西。
你可以使用:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH。但我认为大多数时候,将其用于控制流或类似的东西并不是一个好的实践……
if (obj instanceof C) {
//your code
}
给出了多个正确答案,但仍然有更多方法:Class.isAssignableFrom()和简单地尝试强制转换对象(这可能会抛出ClassCastException)。
总结可能的方法
让我们总结一下测试对象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) {
}
空处理的差异
空处理是有区别的:
在前两个方法中,如果obj为null (null不是任何东西的实例),表达式的值为false。 第三个方法显然会抛出NullPointerException。 相反,第4和第5个方法接受null,因为null可以转换为任何类型!
要记住:null不是任何类型的实例,但它可以转换为任何类型。
笔记
class . getname()不应该用来执行“is-instance-of”测试,因为如果对象不是C类型,而是它的子类,它可能有完全不同的名称和包(因此类名显然不匹配),但它仍然是C类型。 出于同样的继承原因,Class.isAssignableFrom()不是对称的: 如果obj的类型是C.class的子类,obj. getclass (). isassignablefrom (C.class)将返回false。
推荐文章
- Java中的@UniqueConstraint注释
- 如何在清洁模式下运行eclipse ?如果我们这样做会发生什么?
- 获取java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory异常
- Java中的正则表达式命名组
- c#和Java的主要区别是什么?
- 什么是NullPointerException,我如何修复它?
- 在Java中使用“final”修饰符
- 无法在Flutter上找到捆绑的Java版本
- 如何在Kotlin解析JSON ?
- 如何在新的材质主题中改变背面箭头的颜色?
- 如何设置OkHttp连接超时
- 用于桌面应用程序的Swing vs JavaFx
- 为什么这个Java程序会终止,尽管它显然不应该(也没有)终止?
- 使用split("|")按管道符号拆分Java字符串
- 当内存不足导致抛出OutOfMemoryError时会发生什么?