如果类B和类C扩展了类A,我有一个类型为B或C的对象,我如何确定它是哪种类型的实例?
当前回答
给出了多个正确答案,但仍然有更多方法: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。
其他回答
if (obj instanceof C) {
//your code
}
我在我的GeneralUtils类中使用blow函数,检查它可能有用
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
使用Object.getClass。它返回对象的运行时类型。下面是如何使用你的例子来调用它:
class A {}
class B extends A {}
class C extends A {}
class Main {
public static void main(String args[]) {
C c = new C();
Class clazz = c.getClass();
System.out.println(clazz);
}
}
输出:
class C
您还可以比较两个Class实例,以确定两个对象是否属于同一类型。
class A {}
class B extends A {}
class C extends A {}
class Main {
public static void main(String args[]) {
B b = new B();
Class c1 = b.getClass();
C c = new C();
Class c2 = c.getClass();
System.out.println(c1 == c2);
}
}
给出了多个正确答案,但仍然有更多方法: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。
your_instance.getClass().getSimpleName()将给出类型名称,例如:字符串,Integer, Double, Boolean…
推荐文章
- 将所有非字母数字字符替换为空字符串
- 漂亮地打印Java集合(toString不返回漂亮输出)
- 静态嵌套类在Java,为什么?
- 如何防止Eclipse在启动时挂起?
- Optional和Optional的区别是什么?flatMap和Optional.map?
- Java中枚举的命名:单数还是复数?
- JavaBean和POJO之间的区别是什么?
- 注释在Java中如何使用,在哪里使用?
- c++中的结构继承
- 基于原型的继承与基于类的继承
- 如何在Ubuntu下安装JDK 11 ?
- Spring Boot -无法确定数据库类型为NONE的嵌入式数据库驱动程序类
- 如何转换/解析从字符串到字符在java?
- 如何在Android中动态更改菜单项文本
- 如何比较两个没有时间部分的日期?