如何确定一个对象的类别?

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

对该问题的评论 (2)
解决办法
if (obj instanceof C) {
//your code
}
评论(6)

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

评论(3)

提出了多个正确答案,但还有更多的方法。 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 "的处理上有区别。

  • 在前两种方法中,如果objnullnull不是任何东西的实例),表达式就会评估为false
  • 第3个方法显然会抛出一个NullPointerException
  • 第4和第5个方法则相反,接受null,因为null可以被转换为任何类型!

要记住。 null不是任何类型的实例,但它可以被投**为任何类型。

注释

  • Class.getName()不应被用来执行_"is-instance-of"_测试,因为如果对象不是C类型,而是它的一个子类,它可能有一个完全不同的名称和包(因此类名显然不会匹配),但它仍然是C类型。
  • 出于同样的继承原因,Class.isAssignableFrom()不是_对称的。 如果obj.getClass().isAssignableFrom(C.class)的类型是C的子类,则obj.getClass().isAssignableFrom(C.class)将返回false
评论(1)

你可以使用。

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

HTH。但我认为在大多数情况下,对于控制流或类似的东西,使用这个方法是不可取的...

评论(1)

任何建议的方法的使用都被认为是一种代码气味,它是基于一个糟糕的OO设计。

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

任何一个建议的方法都可以,但只是在设计上要记住的东西。

评论(11)

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

objectName.getClass().getName();

示例:-

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

}</pre&gt.在这种情况下,你将得到传递给HttpServletRequest接口引用变量的类名。

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

评论(2)

在"Class&quot上也有一个[.isInstance][1]方法。 类上有一个[.isInstance][1]方法。 如果你通过myBanana.getClass()得到一个对象'的类,你可以看到你的对象myApple是否是和myBanana同一个类的实例,通过

myBanana.getClass().isInstance(myApple)

[1]: http://java.sun.com/javase/6/docs/api/java/lang/Class.html#isInstance(java.lang.Object)

评论(0)

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

if(someObject.getClass().equals(C.class){
// 做一些事情
}
评论(0)