提问者:小点点

为什么这种重载场景在Java中是不可能的?


我试图依靠重载来构建一些通用的东西,我对这个拦截器感到惊讶:

  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{}


共1个答案

匿名用户

对象的类型a在编译时是未知的,编译器无法确定调用哪个版本的map方法,因此是模棱两可的

为了解决这个问题,

选项1:将a的类型更改为更具体

  • (例如,A a=new A()或B b=new B())

选项2:修改C接口的map方法以接受任何实现I接口的对象

  • (例如,字符串映射(I i))。