我试图依靠重载来构建一些通用的东西,我对这个拦截器感到惊讶:
interface I {}
static class A implements I {}
static class B implements I {}
interface C {
String map(A a);
String map(B b);
}
public static void main(String[] args) {
// Injected at runtime;
C mapper = getInstance();
I a = new A();
I b = new B();
// This fail at compilation
String result = mapper.map(a);
}
编译器发现mapper.map(a)不明确。为什么编译器在上面的场景中失败,在运行时可以识别I
的具体实例?正如在接口C
中一样,这两种方法都接受子类。
错误信息:
java: no suitable method found for map(Main.I)
method Main.C.map(Main.A) is not applicable
(argument mismatch; Main.I cannot be converted to Main.A)
method Main.C.map(Main.B) is not applicable
(argument mismatch; Main.I cannot be converted to Main.B)
即使我们说可以将I
类型的其他实例传递给mapper,这也应该用密封接口来修复,我允许A, B{}
对象的类型a
在编译时是未知的,编译器无法确定调用哪个版本的map方法,因此是模棱两可的
为了解决这个问题,
选项1:将a
的类型更改为更具体
选项2:修改C接口的map方法以接受任何实现I接口的对象