代码之家  ›  专栏  ›  技术社区  ›  carrier

如何确定对象的类?

  •  457
  • carrier  · 技术社区  · 16 年前

    如果类 B 和班 C 扩展类 A 我有一个类型的对象 C ,如何确定它是实例的类型?

    7 回复  |  直到 7 年前
        1
  •  730
  •   Michael Myers KitsuneYMG    16 年前
    if (obj instanceof C) {
    //your code
    }
    
        2
  •  306
  •   Bill the Lizard    11 年前

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

        3
  •  149
  •   icza    7 年前

    提出了多种正确的答案,但还有更多的方法: 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 处理

    无效的 但处理:

    • 在前两个方法中,表达式的计算结果为 false 如果 OBJ 无效的 ( 无效的 不是任何事物的实例)。
    • 第三种方法会抛出 NullPointerException 很明显。
    • 第四和第五种方法相反接受 无效的 因为 无效的 可以铸造成任何类型!

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

    笔记

    • Class.getName() 不应用于执行 “是的实例” 如果对象不是类型,则测试becase C 但是它的子类,它可能有一个完全不同的名称和包(因此类名显然不匹配),但它仍然是类型 C .
    • 因为同样的继承原因 类.IsassignableFrom()。 不是 对称的 :
      obj.getClass().isAssignableFrom(C.class) 会回来 如果类型 OBJ 是的子类 C .
        4
  •  30
  •   Johannes Weiss    16 年前

    你可以使用:

    Object instance = new SomeClass();
    instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
    instance.getClass(); //will return the SomeClass' Class object
    

    Hth.但我认为在大多数情况下,将其用于控制流程或类似的事情并不是一个好的实践。

        5
  •  24
  •   Yuval Adam    16 年前

    使用任何建议的方法都被认为是基于糟糕的OO设计的代码味道。

    如果你的设计是好的,你不应该发现自己需要使用 getClass() instanceof .

    任何建议的方法都可以,但只是记住一些设计方面的问题。

        6
  •  15
  •   Navnath Godse Kostiantyn Koval    11 年前

    在这种情况下,我们可以使用反射

    objectName.getClass().getName();
    

    例子:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        String name = request.getClass().getName();
    }

    在这种情况下,您将得到对象传递到的类的名称 HttpServletRequest 接口引用变量。

        7
  •  13
  •   Sk8erPeter miku    11 年前

    还有一个 .isInstance 方法论 Class “上课。如果通过 myBanana.getClass() 你可以看到你的物体 myApple 是与相同类的实例 myBanana 通过

    myBanana.getClass().isInstance(myApple)