java泛型

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数

引入泛型的好处是安全简单。可以将运行时错误提前到编译时错误。没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

在泛型接口、泛型类和泛型方法的定义过程中,我们常见的如T、E、K、V等形式的参数常用于表示泛型形参

1、实例的类型是相同的

Box<String> name = new Box<String>("1");

Box<Integer> age = new Box<Integer>(2);

System.out.println("name class:" + name.getClass()); // com.qqyumidi.Box
System.out.println("age class:" + age.getClass()); // com.qqyumidi.Box
System.out.println(name.getClass() == age.getClass()); // true

泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型

2、类型通配符

类型通配符一般是使用 ? 代替具体的类型实参。

注意了,此处是类型实参,而不是类型形参!且Box<?>在逻辑上是Box<Integer>、Box<Number>...等所有Box<具体类型实参>的父类,例如:

public static void getData(Box<?> data) {

 System.out.println("data :" + data.getData());

}

参数类型可以是任何Box<具体类型实参>

3、类型通配符上下限

将上面的方法改造下

public static void getData(Box<? extends Number> data) {

 System.out.println("data :" + data.getData());

}

这时,参数类型就只能是具体类型为Number或子类的了,例如:Box<Integer>,Box<Number>等

4、定义新类型

<T> T[] toArray(T[] a)

<T>定义了一种新类型,这样在返回类型"T[]" 和 参数类型"T[]" 上都能指定这种新类型

原文地址:https://www.cnblogs.com/ptw-share/p/6930170.html