【问题标题】:How to check if object which is of a sub如何检查对象是否属于子对象
【发布时间】: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 SubTemplateClass.isInstance 适用于您不知道要检查哪个类的情况,通常仅在执行通用操作的框架中才需要,而不是在典型的应用程序代码中。而且使用instanceof 通常并不是代码好的标志。
  • 那么instanceof可以逆序工作吗?模板 -> 子模板和子模板 -> 模板?这两项检查都有效吗?

标签: java inheritance design-patterns polymorphism


【解决方案1】:

这就是instanceof 的目的:

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

所以在检查了它的类型之后,你可以强制转换它而不会出现异常。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多