加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:44:48 所属栏目:Java 来源:网络整理
导读:鉴于这种情况: 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){
鉴于这种情况:
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);
    }
}

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

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

解决方法

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

对于超类方法,擦除是:

public void genericMethod(Object t)

对于子类方法,擦除是:

public void genericMethod(Cat t)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读