方法重载可以自动区分接口实现吗?

Can method overloading discriminate automatically between an interface implementations?

我有两个 类 实现一个接口:

public interface Vehicle {…}
public class Car implements Vehicle {…}
public class Shoes implements Vehicle {…}

在用户层面,我处理的是界面,函数的形式通常是function(Vehicle v):

public class Controller {

    @Inject
    Service service;

    public int get(Vehicle v) {
        return service.getShortestPathLength(v);
    }
}

但是在某些时候我有一个方法,我希望能够区分实现,因为这个特定部分的操作非常不同(例如,在我的示例中,通过步行、乘车、通过飞机或乘船将完全不同)。也就是说,我希望 getShortestPathLength(v) 根据 v:

的实现自动切换(即没有明确的 if 测试)到正确的重载方法
public class Service {

    public int getShortestPathLength(Car c) {…}
    public int getShortestPathLength(Shoes s) {…}

}

然而它似乎没有按原样工作,我得到一个未解决的编译问题错误:

The method getShortestPathLength(Vehicle) in the type Service is not applicable for the arguments (Car)

我正在努力实现的目标是否可行,如果可行,我还缺少什么?

我目前的解决方法是在 getShortestPathLength(Vehicle v) 内测试 v.getClass().getSimpleName(),但尽管它有效,但它似乎并不是面向对象编程的优化使用。

FWIW 我是 运行 Java 11 岁,使用 Quarkus 1.6.0。

我可以建议三个选项:

  • 将 getShortestPathLength() 移动到 Verhicle,并根据 Car 和 Shoes 的不同特性进行不同的实现。此选项增加了封装。这个选项是否可以实现取决于你的逻辑。如果 getShorttestPathLength 可以使用 Verhicle 中的数据实现,则不需要其他信息
  • 在服务中使用重载技术声明 3 个不同的函数,并将您在服务实现中的代码划分为有意义的小块,以便在不同的函数中重用它们。通过使用此选项,我们必须为每次调用提供正确的参数类型,以便获得要加载的正确方法。
  • 使用一种方法声明服务接口:getShortesPathLength。使用不同的逻辑为服务实现不同的变体。正确注入服务实例,以便调用正确的实现。此选项基于服务的多态性

您的解决方法不错,但我认为在 运行 时间内检查实体类型不是个好主意。