如何检查对象是否是sub

时间:2018-04-04 07:34:51

标签: java inheritance design-patterns polymorphism

我有一个建模的对象:

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

这似乎不起作用,因为条件总是错误的。我怎样才能实现目标?

我意识到这是一个什么样的黑客,但我正在问什么可能?如果是这样怎么样?

1 个答案:

答案 0 :(得分:1)

这是instanceof的意图:

Template t = something();
if (t instanceof SubTemplate) {
    SubTemplate sub = (SubTemplate) t;
    sub.getReport();
}

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

请注意,这通常被视为代码气味,请参阅注释以获取有关原因的更多信息的链接。