方法重载可以自动区分接口实现吗?
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。使用不同的逻辑为服务实现不同的变体。正确注入服务实例,以便调用正确的实现。此选项基于服务的多态性
您的解决方法不错,但我认为在 运行 时间内检查实体类型不是个好主意。
我有两个 类 实现一个接口:
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 typeService
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。使用不同的逻辑为服务实现不同的变体。正确注入服务实例,以便调用正确的实现。此选项基于服务的多态性
您的解决方法不错,但我认为在 运行 时间内检查实体类型不是个好主意。