给定一个接受某个超类型作为参数的方法。在该方法中,有没有办法确定传递给它的对象的实际类?即如果实际传递了allowable参数的子类型,有没有办法找出它是哪种类型?如果这是不可能的,有人可以解释为什么不(从语言设计的角度来看)?感谢
更新:只是为了确保我很清楚
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
的子类型(以及哪一个)。
答案 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)) {
}