为了账号安全,请及时绑定邮箱和手机立即绑定

如何确定对象的类?

如何确定对象的类?

忽然笑 2019-07-22 15:57:48
如何确定对象的类?IF类B和阶级C扩展类A我有一个类型的对象B或C,如何确定它的哪种类型是实例?
查看完整描述

3 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

if (obj instanceof C) {
//your code
}


查看完整回答
反对 回复 2019-07-22
?
千巷猫影

TA贡献1829条经验 获得超7个赞

使用Object.getClass()..它返回对象的运行时类型。


查看完整回答
反对 回复 2019-07-22
?
精慕HU

TA贡献1845条经验 获得超8个赞

提出了多个正确的答案,但仍然有更多的方法: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) {
}

差异null装卸

有区别null不过,处理:

  • 在前两个方法中,表达式计算为

    false

    如果

    obj

    null (null

    不是任何事物的实例)。
  • 第三种方法会抛出一个

    NullPointerException

    很明显。
  • 第四种和第五种相反的接受方法

    null

    因为

    null

    可以投到任何类型!

记住:null 不是除了它以外的任何类型的实例。可以铸造任何类型的。

注记

  • Class.getName()

    不应用于执行

    “是-例如-”

    测试对象是否不是类型

    C

    但是它的一个子类,它可能有一个完全不同的名称和包(因此类名显然不匹配),但它仍然是类型的。

    C.

  • 出于同样的继承原因

    Class.isAssignableFrom()

    不是

    对称:
    obj.getClass().isAssignableFrom(C.class)

    会回来

    false

    如果

    obj

    C.


查看完整回答
反对 回复 2019-07-22
  • 3 回答
  • 0 关注
  • 481 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信