概念

Java 泛型是 JavaSE 5.0 新增加的特性,该特性允许在编译时检测到非法的类型,本质是参数化类型。

泛型程序设计 意味着编写的代码可以被很多不同类型的对象重用。

Java 泛型是伪泛型,因为在Java编译期间,会把所有的泛型信息擦除掉,这也称为类型擦除。更多关于类型擦除的问题,可以查看这篇文章 《Java泛型类型擦除以及类型擦除带来的问题》

package com.demo11;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class genericDemo {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
List<Integer> list = new ArrayList<>();
list.add(12);
// 直接添加会报错(类型不一致)
// list.add("2");

// 通过反射之后就可以成功添加
Class<? extends List> listClass = list.getClass();
Method add = listClass.getDeclaredMethod("add", Object.class);
add.invoke(list, "a");
System.out.println(list);
}
}

泛型的使用分类

  • 泛型类
  • 泛型接口
  • 泛型方法

Java库中

  • 变量E表示集合的元素类型
  • KV分别表示表的关键字和值类型
  • T表示任意类型

泛型类

具有一个或多个类型变量的类

package com.demo11;

public class Pair<T> {
private T first;
private T right;

public Pair() {
first = null;
right = null;
}

public Pair(T first, T right) {
this.first = first;
this.right = right;
}

public T getFirst() {
return first;
}

public T getRight() {
return right;
}

public void setFirst(T first) {
this.first = first;
}

public void setRight(T right) {
this.right = right;
}
}

测试类:

package com.demo11;

public class PairTest {
public static void main(String[] args) {
String[] word = {"Mary", "a", "b", "c"};
Pair<String> mm = ArrayAlg.minmax(word);
System.out.println("left: " + mm.getFirst());
System.out.println("right: " + mm.getRight());
}
}

class ArrayAlg {
public static Pair<String> minmax(String[] a) {
if (a == null || a.length == 0 ) {
return null;
}
String min = a[0];
String max = a[0];

for (String item : a) {
if (min.compareTo(item) > 0) {
min = item;
}
if (max.compareTo(item) < 0) {
max = item;
}
}

return new Pair<String>(min, max);
}
}

泛型接口

public interface GenericInterface<T> {
public T show();
}

class GenericTpl<T> implements GenericInterface<String> {
public String show() {
return "Hello";
}
}

泛型方法

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