Java泛型/通配符/泛型擦除

Java泛型/通配符/泛型擦除

Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.
泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
参数化类型:

  • 把类型当作是参数一样传递
  • <数据类型> 只能是引用类型

相关术语:

  • ArrayList<E>中的E称为类型参数变量
  • ArrayList<Integer>中的Integer称为实际类型参数
  • 整个称为ArrayList<E>泛型类型
  • 整个ArrayList<Integer>称为参数化的类型ParameterizedType

关于List和List关系的解释Demo

public class testGenericity {
    static void formArrayToCollection(Object[] arr, Collection<Object> collection){
        for (Object o : arr){
            collection.add(o);
        }
    }

    public static void main(String[] args) {
        String[] str = {"a","b"};
        List<String> list = new ArrayList<>();
        testGenericity.formArrayToCollection(str,list);
    }
}

泛型中的List和List中不是继承关系。
Collection并不能说是Collection,Collection的父类从而替代这两个类型的集合,无法通过编译。
在这里插入图片描述



下面是通过正确使用泛型后的修改代码:

public class testGenericity {
    static <T> void formArrayToCollection(T[] arr, Collection<T> collection){
        for (T o : arr){
            collection.add(o);
        }
    }

    public static void main(String[] args) {
        String[] str = {"a","b"};
        List<String> list = new ArrayList<>();
        testGenericity.formArrayToCollection(str,list);
        for (String item : list){
            System.out.println(item);
        }
    }
}

设定通配符号上限

//传递进来的只能是Type或Type的子类
List<? extends Type>

设定通配符下限

//传递进来的只能是Type或Type的父类
< ? super Type>
无论是设定通配符上限还是下限,都是不能操作与对象有关的方法,只要涉及到了通配符,它的类型都是不确定的!

public class testGenericity {
    public static <T> void test(List<?> list ){
        Object o = new Object();
        list.add(o);
   }
}
//会报错

无限制泛型擦除

擦除前
在这里插入图片描述

擦除后

在这里插入图片描述

ReturnVo<String> test = new Return<>();

反编译后,本来类型为T的data变量,类型被编译器变为Object了
当在外面调用ReturnVo类时,传入String类型,看看编译器是如何将data变量从Object类型转化为String类型的

  1. invokevirtual是一种动态分派的调用指令,此时编译器并不能确定data变量的类型,还是当做Object进行处理的;
  2. 随着编译器插入了一条checkcast指令,将data从Object类型强转为String类型。
  3. 在这里插入图片描述

有限制类型擦除

有限制擦除类型就是如:T extends B这种,在编译的时候会将类中T类型的变量类型变成B
擦除前:
在这里插入图片描述

擦除后:
在这里插入图片描述



创建一个继承了Person的Student类
在这里插入图片描述

在这里插入图片描述

已标记关键词 清除标记
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页