一、简单小例子。
尖括号中包含的是形式类型参数(formal type parameters),它们就如同一般的类型一样,可以在整个类的声明中被使用。
当类被使用时,会使用具体的实际类型参数(actual type argument)代替。
形式类型参数的命名:尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2),比如许多容器集合使用E,代表element(元素),Map中用K代表键keys,V代表值。
值得注意:基本数据类型调用泛型函数,返回对应的包装类型。
public static void main(String[] args) { // 基本数据类型返回对应的包装类型 Integer num = getGener(122); Character[] ch = new Character[] { 'w', 's', 'w' }; getGener2(ch); System.out.println(num); } private static <T> T getGener(T o) { return o; } private static <T> T getGener2(T[] o) { T obj = o[2]; return obj; }
二、泛型类
import java.util.Arrays; class Tool<T> { public void reverse(T[] arr) { Arrays.sort(arr); } } public class Generics { public static void main(String[] args) { Tool<Integer>tool=new Tool<Integer>(); Integer[]num={1,3,0,2}; tool.reverse(num); } }
三、泛型接口
interface Dao<T> { } class Demo <T> implements Dao<T> { }
四、限制泛型
package generics; import java.util.ArrayList; import java.util.Collection; public class Generics { public static void main(String[] args) { ArrayList<Integer>arr=new ArrayList<Integer>(); ArrayList<Object>objs=new ArrayList<Object>(); lower(arr); lower(objs); } // 下限:Integer的父类 public static void lower(Collection<? super Integer> o) { } // 上限:Number的子类 public static void upper(Collection<? extends Number> o) { } }