java - 在编译时不知道类型的情况下可以使用方法重载吗?

标签 java polymorphism

如果我们举一个非常基本的例子:

public static void main(String[] args) {
    animalMineralOrVegetable(new Animal());
    animalMineralOrVegetable(new Mineral());
    animalMineralOrVegetable(new Vegetable());
}

public static void animalMineralOrVegetable(Animal animal) {
    print("Animal");
}

public static void animalMineralOrVegetable(Mineral mineral) {
    print("Mineral");
}

public static void animalMineralOrVegetable(Vegetable vegetable) {
    print("Vegetable");
}

由于所有类型在编译时都是已知的,因此我们得到了预期的结果。

但是,如果我们依赖另一个类的方法,例如,具有 Object 返回类型的方法,则使用 instanceof 并强制转换我们唯一的选项(除了反射)?

public static void main(String[] args) {
    animalMineralOrVegetable(SomeClass.getSubject()); // object return type
}

如果声明的返回类型与方法实现之一不匹配(如上所述),上面的代码显然不会编译。

显然,如果该方法仅返回每种类型实现的接口(interface),我们将重构为单个 animalMineralOrVegetable() 方法并调用通用打印方法。

我试图避免重复代码,但受到写得不好的遗留 API 的限制。

最佳答案

您提供了一个非常基本的示例,但我可能会尝试做这样的事情:

public AnimalOrMineralWrapper{
    String message;
    T t;

    public AnimalOrMineralWrapper(T t, String message){
        this.t = t;
        this.message = message;
    }
    public String getMessage(){
        return message;
    }
}

您现在可以使用将类包装在其中,如下所示:

public static void main(String[] args){
    Mineral mineral = new Mineral();
    AnimalOrMineralWrapper<Mineral> mineral = new AnimalOrMineralWrapper(mineral, "mineral");
}

public static void animalMineralOrVegetable(AnimalOrMineralWrapper wrapper) {
    print(wrapper.getMessage());
}

如果 print 是一个 API 调用,您不能只向其传递任何内容,您可以添加一个额外的实例变量,或者只是在对象实例化时将 message 设置为 null。然后,如果 message 为 null,则不要进行服务调用。

这是一种潜在的解决方案,但我猜您的实现会更复杂。

关于java - 在编译时不知道类型的情况下可以使用方法重载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42863102/

相关文章:

java - 是否可以在不依赖 Hadoop 和 HDFS 的情况下使用 Java 读写 Parquet?

java - 基本 SpringMvC Controller 不工作

polymorphism - 如何在 Elixir 中实现函数/进程多态性

haskell - 多态性:常数与函数

c++ - 在不修改原有类的情况下添加虚函数

java - 调用 dispose() 不会关闭 JFrame

java - JDBC 驱动程序开发文档 (SPI) 需要哪些类

从公共(public)基类派生的函数传递和返回 C++ 对象

ruby-on-rails - 在 rails 模型中覆盖 to_s ...可能吗?

java - Jenkins - 带有动态 html 报告文件的电子邮件附件