通用方法不覆盖超类中类似的泛型方法 - >使用哪一个?

Dan*_*lBK 6 java generics ambiguous

鉴于这种情况:

 public class Animal {

    public <T> void genericMethod(T t){
        System.out.println("Inside generic method on animal with parameter " + t.toString());
    }
}

public class Cat extends Animal {

    public <T extends Cat> void genericMethod(T t){
        System.out.println("Inside generic method on cat with parameter " + t.toString());
    }
}

public class Main {

    public static void main(String[] args) {
        Animal animal = new Animal();
        Cat cat = new Cat();
        cat.genericMethod(cat);
    }
}
Run Code Online (Sandbox Code Playgroud)

genericMethod()类中的方法Cat绝对不会覆盖超类方法(并且编译器会抱怨,如果我添加@Override签名)这是合理的,因为对类型的要求T是不同的.

但我不太明白,编译器如何决定cat.genericMethod(cat)在main方法的调用中使用哪两种方法.因为实际上这两种方法都是可见的并且都适用.我本来期望编译器错误,如"ambigous函数调用".有人可以解释这种行为吗?

Era*_*ran 7

由于子类方法的泛型类型绑定,这两种方法具有不同的擦除.

对于超类方法,擦除是:

public void genericMethod(Object t)
Run Code Online (Sandbox Code Playgroud)

对于子类方法,擦除是:

public void genericMethod(Cat t)
Run Code Online (Sandbox Code Playgroud)

重载解析规则的方法选择具有最佳匹配参数的方法.因此,当您传递Cat参数时,将选择第二个(子类)方法.

  • @VictorNoël不,这是一个编译时决定.方法重载分辨率在编译时完成. (3认同)
  • @VictorNoël你必须谈论擦除,因为否则两种方法都有签名`genericMethod(T t)`,你不能说一个具有比另一个更具体的参数类型. (2认同)