概念
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);
Class<? extends List> listClass = list.getClass(); Method add = listClass.getDeclaredMethod("add", Object.class); add.invoke(list, "a"); System.out.println(list); } }
|
泛型的使用分类
Java库中
- 变量
E
表示集合的元素类型
K
和V
分别表示表的关键字和值类型
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]; } }
|