【问题标题】:Java method with unknown parameter type具有未知参数类型的 Java 方法
【发布时间】:2022-12-01 00:33:27
【问题描述】:

我是 Java 的新手。

我正在处理的项目中的多个文件中存在重复代码。 对象类型可以是 Thing1、Thing2、Thing3 等。 所以代码看起来像:

if (Thing1.getStuff() instanceof String) {
  myObj.setString("Hello");
} else {
  myObj.setString("World");
}

我想用一个类和方法来扩展 myObj 来处理这个问题,如下所示:

public class myObj extends doStuff {...}

--

class doStuff {
    public String DoThis(*WHAT_TYPE_TO_USE* input) {
        var String = input.myMethod(); // I need to call method.
        return "String after some logic";
    }
}

哪个应该允许我运行:

 myObj.DoThis("Something");

但是,我不能在方法中将输入指定为特定类型,因为它可能是 Thing1、Thing2 等。此外,Thing1 和 Thing2 不能动态导入,不是吗?如何运行 myMethod(存在于 Thing1 和 Thing2 中)?

任何建议表示赞赏。

【问题讨论】:

  • getStuff的签名是什么?实际上,Thing1 和 Thing2 应该有自己的 myMethod 实现,并且根本没有问题。
  • 我对您的潜在需求感到困惑。但我感觉到接口(或抽象机制)是你所需要的。
  • 无关:请坚持 Java 命名约定
  • @kleopatra 我不认为这是不相关的。 Thing1.getStuff() 看起来像一个静态方法,他们说 Thing1Thing2 是类型。所以他们缺乏细节,命名约定可以帮助澄清
  • @matt 是的,虽然我们不能真正知道 getStuff 是静态的还是草率的 sn-ps,但我们知道 class doStuffvoid DoThis 确实是命名违规:)

标签: java inheritance


【解决方案1】:

您需要您的 Thing 类来实现一个通用接口,例如

public interface Thing {
  public String myMethod();
}

public class Thing1 implements Thing {
  ...
}

如果它们没有共同的超类型,那么这两个 myMethod 方法是无关.它们具有相同名称的事实与 Java 无关;它们是在不同类中定义的不同方法。你能够用反射恶作剧访问它们,但是你放弃了很多类型安全(在这一点上,你只需要一个Object并相信用户提供正确类型的值;它又丑又乱,我不推荐)。

如果有问题的类是第三方类(即你不控制的)并且没有实现公共接口,那么你需要adapter pattern。基本上,您定义一个新类实现接口并包装原始实例。

public class Thing1Adapter implements Thing {
  private Thing1 impl;

  public Thing1Adapter(Thing1 impl) {
    this.impl = impl;
  }

  @Override
  public String myMethod() {
    return this.impl.myMethod();
  }

}

...

DoThis(new Thing1Adapter(myThing1));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多