如果类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。

其他回答

您可以使用getSimpleName()。

假设我们有一个对象:Dog d = new Dog(),

我们可以使用下面的语句来获取类名:Dog。例如:

.getSimpleName d.getClass () ();//返回String 'Dog'。

PS: d.g getclass()会给你对象的全名。

如果你想在运行时知道,用isinstance()检查是不够的。 使用:

if(someObject.getClass().equals(C.class){
    // do something
}

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

objectName.getClass().getName();

例子:-

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getClass().getName();
}

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

使用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); 
  } 
}
if (obj instanceof C) {
//your code
}