如果我们举一个非常基本的例子:
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/