我有一个这样建模的对象:
public class Template {
private Form form;
public Form getForm() { return form; }
}
public class SubTemplate extends Template {
private Report report;
public Report getReport() { return report; }
}
public class AnotherSubTemplate extends Template {
private Sheet sheet;
public Sheet getSheet() { return sheet; }
}
我的目标:
我想知道如何检查在这种情况下我正在处理的
Template
基础对象是否正在行使多态性并且实际上是SubTemplate,因此我可以从中检索报告对象吗?我的意思是这样的:
main() {
Template t = something();
if( t.getClass().isInstance(SubTemplate.class) ) {
Report r = ((SubTemplate) t).getReport();
}
}
这似乎不起作用,因为条件始终为假。我如何实现我的目标?
我意识到这有点骇人听闻,但我要问的可能吗?如果可以,该怎么办?
最佳答案
这是instanceof
的作用:
Template t = something();
if (t instanceof SubTemplate) {
SubTemplate sub = (SubTemplate) t;
sub.getReport();
}
因此,在检查了其类型之后,可以在不预期异常的情况下进行强制转换。
请注意,这通常被认为是代码气味,请参阅注释以获取有关为什么这样的更多信息的链接。