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

如何确定对象的类?

如何确定对象的类?

慕后森 2019-07-26 15:14:06
如何确定对象的类?IF类B和阶级C扩展类A我有一个类型的对象B或C,如何确定它的哪种类型是实例?
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-07-27
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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

查看完整回答
反对 回复 2019-07-27
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

提出了多个正确的答案,但仍然有更多的方法: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-27
  • 3 回答
  • 0 关注
  • 270 浏览

添加回答

举报

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