登录

去注册 忘记密码?

登录

注册

去登录

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

获取注册验证码

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

每日一问 | Java 泛型与接口碰撞出的火花!

鸿洋    2020-09-09 23:54   收藏

之前我们问过:

每日一问 Java编译器背后干了多少活 之 「内部类构造」

提到了isSynthetic,注意今天的问题也是个类似的问题。

首先我们编写个接口:

interface Animal<T>{
    void test(T t);
}

这个接口有个实现类:

class Dog implements Animal<String>{

    @override
    public void test(String str){
    }
}

符合我们平时的写法对吧。

但是你仔细推敲一下:

接口 Animal 类的泛型,在编译成 class 后,会经历泛型擦除,会变成这样:

interface Animal{
    void test(Object obj);
}

而实现类Dog里面有个方法test(String str),注意这个方法和接口类的方法参数并不一致

那么也就是说,并没有实现接口中的方法。

但是,接口的方法,实现类是必须实现的。

问题来了:

  • 为何不报错呢?
  • 除了这个场景,编译期间还有哪里有类似的处理方式么?(可不回答)

自助提问入口:点击提交问题

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定