Java - 如何告诉对象的类?

时间:2010-05-06 00:37:44

标签: java oop programming-languages

给定一个接受某个超类型作为参数的方法。在该方法中,有没有办法确定传递给它的对象的实际类?即如果实际传递了al​​lowable参数的子类型,有没有办法找出它是哪种类型?如果这是不可能的,有人可以解释为什么不(从语言设计的角度来看)?感谢

更新:只是为了确保我很清楚

Context: MySubType extends MyType

void doSomething(MyType myType) {
  //determine if myType is MyType OR one of its subclasses
  //i.e. if MySubType is passed as a parameter, I know that it can be explicitly
  //cast to a MySubType, but how can I ascertain that its this type
  //considering that there could be many subclasses of MyType
}

由于方法签名将参数指定为MyType,那么如何判断对象实际上是MyType的子类型(以及哪一个)。

3 个答案:

答案 0 :(得分:5)

如果查看Object类的javadoc,您会发现每个对象都支持getClass()。那是对象的Class,你可以从那里开始。

如果对象是MyType,那么getClass() == MyType.class'. If the object is a superclass, then getClass()!= MyType.class`。

只有这些可能性。如果参数的类型是MyType,而MyType是一个类而不是一个接口,那么该对象可以是MyClass,也可以是一个子类型。如果它是子类型,则getClass()将返回子类型的Class。您可以使用Class的API来探索它。

当然,您可以使用反射来探索类型层次结构。您可以向MyType.class询问其直接子类的列表,并从那里递归,并有一个很好的时间。但你不需要。

答案 1 :(得分:1)

是的 - 有一个名为Trail的内置反射API,允许您检查类的任何实例的类型。从getClass()类继承的方法Object将为您提供可以检查的Class对象。一个很好的起点是Trail tutorial from Sun

答案 2 :(得分:1)

我假设MyType是超类类型,对吗?

1 /如果您只是想知道它不属于您的超类类型: 你可以检查

if (m.getClass() != MyType.getClass())

2 /如果你想检查m是否属于某个子类,我认为没有办法,你必须硬编码就像

if (m.getClass() == MySubType) {
}

或者您可以使用:

if (!(m instanceof MySubType)) {
}