我有一个这样建模的对象:

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();
}


因此,在检查了其类型之后,可以在不预期异常的情况下进行强制转换。

请注意,这通常被认为是代码气味,请参阅注释以获取有关为什么这样的更多信息的链接。

07-24 09:49