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

  • 相关阅读:
    请简单说一下你了解的端口及对应的服务?
    地址解析协议ARP和逆地址解析协议RARP
    IP地址分类
    OSI分层和五层协议
    对象如何晋升到老年代?
    JVM 垃圾回收机制,何时触发 MinorGC 等操作
    什么是引用?
    类加载机制
    Solaris10怎么创建flash archive
    RPC: program not registered (ZT)
  • 原文地址:https://www.cnblogs.com/silence-fire/p/9163367.html
Copyright © 2020-2023  润新知