JAVA基础之(十二)“泛型”
一、泛型意义:编写的代码可以被不同类型的对象重用
原始方式:使用object类型,然后进行强转;
泛型优点:更好的安全性和可读性;
泛型定义:具有一个或多个类型变量的类;
二、简单泛型类示例
1 /**泛型类*/ 2 3 /*单个泛型变量*/ 4 public class Part1<T>{ 5 /*方法中简单使用泛型*/ 6 public Part1(T first,T second){......}; 7 } 8 9 /*多个泛型变量*/ 10 public class Part2<T,U>{......}
类型变量(如:T/U等)的作用范围:指定方法的返回类型、域(注!)、局部变量的类型;
类型变量表示含义:E-集合的元素类型;K/V-表的关键字/值的类型;T(需要时可以用临近的U/S)表示“任意类型”;
三、泛型方法(可以定义在普通类中)
泛型方法示例:
/**泛型方法示例*/ /*普通类*/ class ArrayAlg{ /*类型变量位置:修饰符后面,返回类型前面,其中T...代表多个泛型参数*/ public static <T> getMiddle(T... a) { return a[a.length/2]; } } //调用泛型方法 String middle = ArrayAlg.<String>getMiddle("A","B","C");
四、类型变量的限定(将类型限定为实现给定接口的类)
/*类型变量的限定示例*/ public static<T extends Comparable> T min(T[] a); /*可以设定多个限定,用&连接*/ T extends Comparable & Sializable;
五、泛型代码与虚拟机(泛型是一种编译机制,虚拟机中不存在泛型类型)
1.泛型内部机制“翻译”步骤:代码-编译器-虚拟机
虚拟机中的所有对象都是普通对象,泛型最终会以“原始类型”的表现形式存在,编译器翻译原始类型变成基础类型(先调用限定类型,再用强转转为相应类型);
原始类型定义:删去类型参数后的泛型类型名,“擦除”类型变量,替换为第一个(如果有多个的话)限定类型(无限定的变量使用Object);
2.翻译泛型的两个问题;以及桥方法(涉及到比较细的虚拟机编译问题,后面看);
3.泛型的作用之一:允许泛型代码域遗留代码之间可以互相操作;(示例代码待研究,没遇到过);
六、约束与局限性(大部分由于擦除引起)
1.不能用基本类型实例化类型参数,比如double,float等,但是可以使用包装类Double,Float;
2.运行时类型检查(比如getClass()方法)只能查询到原始类型,查不到运行时类型;
3.不能创建参数化类型的数组,最好使用Arraylist等数组集合;
4.Varargs警告(泛型类型数组的使用限制,示例代码待研究);
5.不能实例化类型变量,(不能用T等类型变量来创建变量/实例);
6.泛型类的静态上下文中类型变量无效,(也就是静态的块、方法、变量中,不能使用泛型);
7.不能抛出或者补货泛型类的实例(泛型类不能有异常捕获/抛出异常,示例代码待研究);
8.注意擦除后的冲突(示例代码待研究);
七、泛型类型的继承规则
泛型类可以扩展(继承)或者实现其他泛型类;
八、通配符类型(个人觉得跟类型变量T任意类型相似)
例如:Pair<? extends Employee> 表示任何泛型Pair类型,但是必须是Employee的子类;
1.通配符类型的超类型限定:通配符类型限定与类型变量限定类似,但是,通配符可以有“超类型限定”,例如:? super Manager ,这里的通配符限定为Manager的所有超类型;
2.无限定通配符:如:Pair(?),与类型Pair的区别:可以用任意队形调用Pair的get/set方法,可能有用;
3.通配符捕获:用类型变量T来捕获通配符,新建一个辅助方法来捕获通配符方法的类型(示例代码待研究);
九、反射和泛型
1.用泛型进行类型匹配确定类的类型;
2.使用泛型确定虚拟机中的泛型类型信息,具体看书中的方法;
总之一句话:反射的内部机制用的就是泛型;(所以避免使用强转)
陌生概念解释:
注1:(这里补充域的定义:field,域是一种属性,可以是一个类变量,一个对象变量,一个对象方法变量或者是一个函数的参数。(补充,class‘s variables,类的实例变量和静态变量称为class's variables,类属变量,也称类变量或数据域;原文:https://blog.csdn.net/iaiti/article/details/38794007)
注2:标签(tagging)接口,也叫做标记接口,作用:当某个类实现这个接口的时候,我们就认为这个类拥有了接口标记的某种功能。(详细解释:https://blog.csdn.net/piaoxuan1987/article/details/79154968);