java - 使用仅在运行时可获得的静态类型

标签 java inheritance instanceof dynamic-cast static-typing

假设我有如下情况:

X 有一个类型为 S 的字段 s

S 由两个类 AB 扩展,它们都实现了一些相同的方法/字段,我们都知道这些方法/字段应该在 S 但不幸的是,情况并非如此。

现在我想做这样的事情:

"A or B" downcast_field;
if(s instanceof A)
    downcast_field = (A)s;
else if (s instanceof B)
     downcast_field = (B)s;

//do something common for the two cases but that need methods implemented both in A and B

问题是预先有一个允许我调用此类方法的静态类型(在 IFs 之外)。

我想由于糟糕的设计,这实际上是不可能的,我必须编写两次相同的代码,这很丑陋,但也许有一个我现在没有看到的解决方案。

最佳答案

如果您可以更改AB,那么您可以为两者添加相同的接口(interface)。这将允许您将此类型提供给 downcast_field 并调用方法。

如果你不能改变AB,那么你有两个选择:

  • 您可以编写A2B2。将 AB 中的代码复制到新类型中。这允许您修改代码(除非您无法控制这些类型的创建)。或者,您现在也可以创建扩展 SS2 并将通用代码放在那里,然后扩展 A2/B2 来自那个。

  • 创建一个接口(interface),然后创建两个只将调用委托(delegate)给实际类型的实现。

    在这个解决方案中,你可以

    Wrapper downcast_field;
    if(s instanceof A)
        downcast_field = new AWrapper( (A)s );
    else if (s instanceof B)
        downcast_field = new BWrapper( (B)s );
    
    downcast_field.foo();
    

    您可以使这两个包装器扩展相同的类型并将公共(public)代码移到那里。

关于java - 使用仅在运行时可获得的静态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031972/

相关文章:

c# - 基类与子类值的字典兼容性

java - 从派生类创建基类对象

java - 在这种情况下如何避免使用instanceof?

java - 使用流的流

java - 尝试在空对象引用上调用虚拟方法

c++ - 用部分模板特化覆盖抽象成员函数

java - instanceof 被认为是不好的做法吗?如果是这样,在什么情况下instanceof仍然更可取?

Java Swing : how to pass mouse events through JLayeredPane

java - Android JSON解析问题: seems to separate it into 2 separate objects and only recognizes one

java - java中的instanceof在嵌套数组列表上