如果我有两个类SuperType
和SubType
SubType
扩展SuperType
,我可以使用if
在运行时检测确切类型吗?< / p>
我的解决方案不起作用如下:
if (t instanceof SubType)
do SubType stuff
else
do SuperType stuff
答案 0 :(得分:6)
伊兰所说的是真的,但如果你能做到这一点,那么使用instanceof就是一个错误:
class SuperType {
void doStuff(...) {
...do SuperType stuff...
}
}
class SubType {
@Override
void doStuff(...) {
...do SubType stuff...
}
}
SuperType t = methodThatMayReturnSuperTypeOrSubType(...);
t.doStuff();
答案 1 :(得分:4)
是的,您可以将if
与instanceof
运算符一起使用。然而,这样做通常是一种设计气味,因为在大多数情况下,这种决定应留给方法调度机制。如果涉及的类型不在您的控制范围内,那么将这种方法添加到这些类型的选项是不可行的。
答案 2 :(得分:2)
你有一个错字。它应该是instanceof
。
语法为:
if (t instanceof SubType) {
//do SubType stuff
} else {
//do SuperType stuff
}
答案 3 :(得分:1)
你可以,例如使用Reflection API。
if (SubType.class.isInstance(t)){
// do SubType stuff
}else{
// do SuperType stuff
}
此处有更多详情:
答案 4 :(得分:0)
你应该使用类getClass()方法在运行时检测确切的类。
if (t.getClass() == SubType.class)
do SubType stuff
else if (t.getClass() == SuperType.class)
do SuperType stuff
else do your stuff