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);

原文地址:https://www.cnblogs.com/silence-fire/p/9163367.html