Java 如何检查对象是否属于子对象

Java 如何检查对象是否属于子对象,java,inheritance,design-patterns,polymorphism,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 Anoth

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

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

}
我的目标是:

我想知道如何检查我在本例中处理的基本对象是否正在执行多态性并且实际上是子模板,以便从中检索报表对象

我的意思是这样的:

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();
}
因此,在检查其类型后,您可以在不期望出现异常的情况下强制转换它


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

如果您需要了解实际拥有的子类,您可能使用了错误的多态性。请参阅:@AndyTurner感谢您提供的链接,但我正在处理的代码似乎比我旧:不确定重新设计是否可行。现在,我正在使用Class.isInstance测试正确的表达式,因为您需要的是SubTemplate.Class.isInstance,但是SubTemplate有一个更简单的t实例。isInstance适用于您不知道要检查哪个类的情况,通常只在执行一般操作的框架中需要,而不是在典型的应用程序代码中。而使用instanceof通常不是好代码的标志。那么instanceof可以按相反的顺序工作吗?模板->子模板和子模板->模板?这两张支票都有效吗?