【发布时间】:2018-04-04 07:34:51
【问题描述】:
我有一个这样建模的对象:
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 的基本对象是否正在执行多态性并且实际上是子模板,所以我可以从中检索报告对象吗?
我的意思是这样的:
main() {
Template t = something();
if( t.getClass().isInstance(SubTemplate.class) ) {
Report r = ((SubTemplate) t).getReport();
}
}
这似乎不起作用,因为条件总是错误的。我怎样才能实现我的目标?
我意识到这有点像黑客,但我要问的可能吗?如果有怎么办?
【问题讨论】:
-
如果你需要知道你实际拥有的子类,你可能使用错了多态性。
-
@AndyTurner 感谢您的链接,但我正在处理的代码似乎比我老 :) 不确定重新设计是否可行。现在我只是在测试
-
使用
Class.isInstance的正确表达式是SubTemplate.class.isInstance(t),但有一个更简单的t instanceof SubTemplate。Class.isInstance适用于您不知道要检查哪个类的情况,通常仅在执行通用操作的框架中才需要,而不是在典型的应用程序代码中。而且使用instanceof通常并不是代码好的标志。 -
那么instanceof可以逆序工作吗?模板 -> 子模板和子模板 -> 模板?这两项检查都有效吗?
标签: java inheritance design-patterns polymorphism