泛型本质
参数化类型,也就是说所操作的数据类型被指定为一个参数。
更准确的说是充当实际参数类型的【占位符】(显然占位符本身是不需要类型的,只是占位而已!!!)
extends 不仅仅是扩展,还可以用来表示泛边界,类似C中的符号常量。
泛型场景
- 泛型类,泛型方法,泛型接口
- 泛型声明 ,泛型参数 指定一个泛型类型名称的标识符
- java 集合框架 通用方法
泛型根源
- 多态实现方式: 重写,接口,抽象类和抽象方法
- 重写式多态 动态绑定实现
- 重载式多态 编译时就确定好了类型
泛型出现
- 没泛型,意味着同样结构的算法,仅仅因参数类型不同,需要写n个逻辑相同的重载方法。
- 从某种意义上讲,泛型将显性类型转换给整成了隐式转换。
泛型规则
泛型的类型参数只能是类类型(包括自定义类),不能是简单类型;
同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的
泛型的类型参数可以有多个;
泛型的参数类型可以使用extends、super语句,例如。习惯上称为“有界类型“;
泛型的参数类型还可以是通配符类型。例如
Class<?> classType =
Class.forName("java.lang.String");
小结
好的代码会说话,献上。
package exam;
import java.util.*;
public class GenericTest {
// 类型通配符 ? 代替具体的类型参数
// List<具体类型实参>的父类
// 通配符参数类型
public static void getData(List<?> data) {
System.out.println("data :" + data.get(0));
}
// 带边界的类型泛型参数
public static void getUperNumber(List<? extends Number> data) {
System.out.println("data: " + data.get(0));
}
public static void main(String[] args) {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();
name.add("icon");
age.add(18);
number.add(314);
getData(name);
getData(age);
getData(number);
}
}