概述
擦除:将会在代码运行期间擦除其类型参数;List<String> 在运行期间将会被擦除为List。
既然泛型将类型参数擦出了,那么它怎么在运行期间知道参数类型,并根据这个类型去调用相应的方法呢?
泛型类型参数将擦除到它的第一个边界,编译器实际会把类型参数替换为它的擦除。<T extends Hasf>这个在运行期间就像是 < Hasf>
既然泛型类型在程序中是被擦出了那在什么时候去检查它的类型是否合法呢?
泛型类型只有在静态类检查期间才出现,在此之后,程序中的所有泛型类型都将你被擦除,替换为它们的非泛型上界。List<T>会变为List,普通类型变量会是Object。
public class GenericHolder<T> {
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
public static void main(String[] args) {
GenericHolder<String> holder = new GenericHolder<String>();
holder.setObj("Item");
//String s = (String )holder.getObj(); //我们不需要checkcast
String s = holder.getObj();
}
}
对set()的类型进行检查时不需要的(这将由编译器进行执行),而get()方法呢?
实际上在进行String s = holder.getObj()操作的时候,编译器将会自动进行强制类型转换的插入操作。泛型所有动作都发生在边界处(对传递进来的值进行额外的编译器检查),并插入对传递出去的值进行转型。边界就是发生动作的地方。(转型时是通过占位控制符获取到类型信息)
最后
以上就是酷炫西装为你收集整理的泛型的擦除的全部内容,希望文章能够帮你解决泛型的擦除所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复