首页 > 编程语言 > 详细

[Java123] 方法重载中遇到的编译器错误: both methods have same erasure => 引入Java泛型type erasure

时间:2019-08-16 18:55:20      阅读:159      评论:0      收藏:0      [点我收藏+]

场景:

当两个重载函数的参数如下

void func(Map<Integer, String> map) {}

void func(Map<Integer, List<String>> map) {}

IDE会报出编译错误:both methods have same erasure

 

解答:

由于Java泛型在编译时擦除类型之后,上述方法会变成

void func(Map map)

 

 

查询了一下,又有几个相关概念需要了解和掌握。

https://www.jianshu.com/p/f9da328c91be

Java的泛型不同于C++的模板:Java泛型是"type erasure",C++模板是"reified generic"

  • type erasure:泛型类型仅存在于编译期间,编译后的字节码和运行时不包含泛型信息,所有的泛型类型映射到同一份字节码。
  • reified generic:泛型类型存在于编译和运行期间,编译器自动为每一种泛型类型生成类型代码并编译进二进制码中。

 

type erasure的本质

泛型(T) --> 编译器(type erasure) --> 原始类型(T被Object替换)
泛型(? extends XXX) --> 编译器(type erasure) --> 原始类型(T被XXX替换)
原始类型指被编译器擦除了泛型信息后,类型变量在字节码中的具体类型。

type erasure导致泛型的局限性

类型擦除降低了泛型的泛化性,使得某些重要的上下文环境中不能使用泛型类型,具有一定的局限性。
 
 

运行时隐含类型转换的开销: 使用泛型时,Java编译器自动帮我们生成了类型转换的代码,这相对于C++模板来说无疑带来了额外的性能开销。

重载方法签名冲突

一个类不能实现同一个泛型接口的两种变体

 

 

https://blog.csdn.net/abc_12366/article/details/79177328

https://blog.csdn.net/weixin_34121282/article/details/88535522 Map泛型

 

[Java123] 方法重载中遇到的编译器错误: both methods have same erasure => 引入Java泛型type erasure

原文:https://www.cnblogs.com/cathygx/p/11365253.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!