java中的泛型类型擦除

举报
穆雄雄 发表于 2022/12/11 13:24:23 2022/12/11
【摘要】 ​编辑大家好,我是雄雄,今天给大家分享的是:java的泛型是类型擦除的。写在前面那么何为类型擦除?类型擦除就是在编译期明确去掉所编程序的类型系统。啥?还不明白?以java泛型为例,java的泛型在编译期有效,在运行期被删除,下面我们来具体的看看。先举例一段代码:public class Test { public void method(String [] strs){} publi...

​编辑

大家好,我是雄雄,今天给大家分享的是:java的泛型是类型擦除的。

写在前面

那么何为类型擦除?类型擦除就是在编译期明确去掉所编程序的类型系统。啥?还不明白?以java泛型为例,java的泛型在编译期有效,在运行期被删除,下面我们来具体的看看。

先举例一段代码:

public class Test {
  
  public void method(String [] strs){}
  public void method(int [] ints){}
  
  public void listmethod(List<String> strList){}
  public void listmethod(List<Integer> intList){}

}

以上这段代码很简单,我们写了4个方法,其中method的两个方法的参数类型不一样,listmethod方法的参数类型也不一样,理论上来说,method的两个方法和listmethod的两个方法都可以构成方法重载,但是,这样写对吗?

这样写编译无法通过。报错的地方就在listmethod方法上,报错信息为:

​编辑

这个错误的意思就是,listmethod<List<String>方法在编译时擦除类型后为listmethod<List<E>与另一个方法重复(listmethod<List<Integer>),也就是说方法名一样,注意这里的一样是指方法名和参数都一样,故报错。

这就是java泛型擦除类型引起的问题,在编译后所有的泛型都会做出相应的转化,可以总结为如下转换规则:

  • List<String>、List<Integer>、List<T>擦除后的类型为List。
  • List<String[]>擦除后的类型为List[]。
  • List<? extends E>、List<? superE>擦除后的类型为List<E>。
  • List<T extends Serializable &Cloneable>擦除后的类型为List< Serializable >

看完以上规则之后你是否明白了上面代码为什么会报编译错误呢?欢迎有问题多多在评论区提出,我们共同探讨解决方法。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。