先来看一下以下 2 段代码,然后再进一步引出我们的泛型。
public static void main(String[] args) { List list = new ArrayList(); list.add("123"); list.add(456); Iterator it = list.iterator(); while(it.hasNext()){ // Error : Integer cannot be cast to String String next = (String)it.next(); } }
上面这段代码,会出现转化异常的情况,但是编译是没问题的,在输出转化的时候却出现了异常,有没有一种冲动想要把集合中的类型归一?下面就是很正常的一个求和的方法,然而我们只能求类型为 Integer 的参数的和。
public Integer add(Integer a,Integer b){ return a + b; }
对于集合来说,我们若是能在编译时期指定该集合中存放数据的类型,这样在类型转化的时候就不会再出现错误了,同样的,在下面的求和方法中,这个方法我们只能求得类型为 Integer 的参数的和,我们能不能做到可以通用的求和呢?使用泛型,就可以做到。
泛型的概念也就是 “ 数据类型参数化 ” 正是由于我们不确定集合中可以指定的类型有哪些,是 Integer 还是 String ?求和方法中参数的数据类型可以有哪些,是 Float 还是 Double ?那我们就可以使用泛型来把这个数据类型给参数化。
泛型的应用有泛型接口,泛型类和泛型方法。下面定义一个泛型类,并演示使用方式。
public class Box <T> { // T 是 Type 的简写,代表任意类型,注意是类,而不是基本数据类型。 // 也可以换成其它单词,这只是一个表示而已。 T t; public T getT() { return t; } public void setT(T t) { this.t = t; } // 在下面的应用中,我们可以将 T 换成任意我们想要的类型 public static void main(String[] args) { Box<Integer> iBox = new Box<Integer>(); Box<Double> dBox = new Box<Double>(); // 在 JDK1.7 及其以上版本可以利用 “类型推断” 这样写。 Box<String> stringBox = new Box<>(); } }
泛型方法的定义只需要在方法的声明中添加 < T > 即可,或是添加一组泛型 <K ,V> 。
public class Util { public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) { return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue()); } } public class Pair<K, V> { private K key; private V value; public Pair(K key, V value) {

