Java 泛型
Java 泛型是 JDK5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
-
泛型方法
写一个泛型方法,该方法调用时可以接收不同类型的参数,根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
定义泛型方法规则:
- 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前
- 每一个类型参数声明部分包括一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
- 类型参数能被用来声明返回值类型,并且能够作为泛型方法得到的实际参数类型的占位符
- 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用类型,不能是原始类型(int,char 等)
自定义一个泛型方法用于输出不同类型的数组数据
public class Test { public static void main(String[] args) { //创建不同类型的数组 Integer[] intArray = {1,2,3,4,5}; Double[] doubleArray = {1.1,1.2,1.3,1.4,1.5}; Character[] charArray = {'A','B','C','D','E'}; printArray(intArray); printArray(doubleArray); printArray(charArray); } //定义一个泛型方法 printArray,用于打印数组 public static <E> void printArray(E[] inputArray){ for (E e : inputArray) { System.out.print(" "+e); } System.out.println(); } } 运行结果: 1 2 3 4 5 1.1 1.2 1.3 1.4 1.5 A B C D E
-
泛型类
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分;和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,用于指定一个泛型类型名称的标识符。因为它们接收一个或多个参数,这些类被称为参数化的类或参数化的类型。
//定义一个泛型类 public class Test<T> { private T t; public void add(T t){ this.t = t; } public T get(){ return t; } public static void main(String[] args) { Test<Integer> integerTest = new Test<>(); integerTest.add(10); System.out.println(integerTest.get()); } } 运行结果: 10
-
类型通配符
-
类型通配符一般是使用 ?代替具体的类型参数,List<?> 在逻辑上 List,List 等所有 List<具体类型实参> 的父类
public class Test { public static void main(String[] args) { List<String> strings = new ArrayList<String>(); List<Integer> integers = new ArrayList<Integer>(); strings.add("aaa"); integers.add(20); getData(strings); getData(integers); } //因为 getData() 方法参数是 List<?>,所以不同类型的都可以作为这个方法的实参,这就是通配符 public static void getData(List<?> data){ System.out.println(data.get(0)); } } 运行结果: aaa 20
-
类型通配符上集成 Number,则通配符泛型值接收 Number 及其下层子类类型
public class Test { public static void main(String[] args) { List<String> strings = new ArrayList<String>(); List<Integer> integers = new ArrayList<Integer>(); strings.add("aaa"); integers.add(20); //会报错,因为方法中的参数限定了参数泛型上限为 Number,所以泛型为String不是这个范围内。 // getData(strings); getData(integers); } public static void getData(List<? extends Number> data){ System.out.println(data.get(0)); } } 运行结果: 20
-