程序员

泛型

2018-07-15  本文已影响21人  于无声处写写写

只标记重要的部分


什么是泛型?

泛型即参数化类型,参数化类型就是说将类型由原来具体给定的某一个类型参数化,也就是说现在的类型是一个参数,由这个参数决定到底是什么类型。
JavaSE7及以后,构造函数中可以省略泛型类型:

ArrayList<String> list=new ArrayList<>();

类型变量放在修饰符的后面,返回类型的前面。

class ArrayAlg
{
    public static <T> T getMiddle(T...a)
    {
        return a[a.length/2];
    }
}

类型变量的限定

public static <T extends Comparable> T min(T[] a)

表示T是Comparable类型的子类型,一个类型变量或通配符可以有多个限定
限定类型用&分隔,逗号用来分隔类型变量
可以有多个接口超类型,但是限定中至多有一个类。
如果用一个类作为限定,它必须是限定列表中的第一个。


泛型代码和虚拟机

虚拟机没有泛型类型对象---所有对象都属于普通类
在虚拟机中,无论何时定义一个泛型类型,都自动提供了一个相应的原始类型,原始类型的名字就是删去类型参数后的泛型类类名。
Pair<T>的原始类型为Pair

Java泛型转换的事实:


使用泛型类时,虽然传入了不同的泛型实参,但并没有真正意义上生成不同的类型,传入不同泛型实参的泛型类在内存上只有一个,即还是原来最基本的类型,举个栗子也就是Pair<T>的原始类型为Pair,原因在于java泛型这一概念提出的目的,导致其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦除,也就是说成功编译过后的class文件是不包含任何泛型信息的,泛型信息不会进入到运行阶段,不会进入虚拟机运行阶段。

约束与局限性

public class Singleton<T>
{
  private static T singleInstance();
}

上述是无效的

public class Problem<T> extends Exception
class Employee implements Comparable<Employee>{}
class Manager extends Employee implements Comparable<Manager>{}

Manager会实现Comparable<Employee>和Comparable<Manager>,这是同一接口的不同参数化。


在逻辑上Box<Number>不能视为Box<Integer>的父类。因为在编译阶段以后会进行类型擦除,都成了Box类

上一篇下一篇

猜你喜欢

热点阅读