开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
编辑
大家好,我是雄雄,今天给大家分享的是: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方法在编译时擦除类型后为listmethod<List与另一个方法重复(listmethod<List),也就是说方法名一样,注意这里的一样是指方法名和参数都一样,故报错。
这就是java泛型擦除类型引起的问题,在编译后所有的泛型都会做出相应的转化,可以总结为如下转换规则:
- List、List、List擦除后的类型为List。
- List<String[]>擦除后的类型为List[]。
- List<? extends E>、List<? superE>擦除后的类型为List。
- List<T extends Serializable &Cloneable>擦除后的类型为List< Serializable >
看完以上规则之后你是否明白了上面代码为什么会报编译错误呢?欢迎有问题多多在评论区提出,我们共同探讨解决方法。