泛型就是定义一种模板,例如ArrayList<T>,然后在代码中为用到的类创建对应的ArrayList<类型>:
ArrayList<String> strList = new ArrayList<String>();
既实现了编写一次,万能匹配,又通过编译器保证了类型安全:这就是泛型。
要特别注意:不能把ArrayList<Integer>向上转型为ArrayList<Number>或List<Number>。观察一下代码:
// 创建ArrayList<Integer>类型:ArrayList<Integer> integerList = new ArrayList<Integer>();// 添加一个Integer:integerList.add(new Integer(123));// “向上转型”为ArrayList<Number>:ArrayList<Number> numberList = integerList;// 添加一个Float,因为Float也是Number:numberList.add(new Float(12.34));// 从ArrayList<Integer>获取索引为1的元素(即添加的Float):Integer n = integerList.get(1); // ClassCastException!
我们把一个ArrayList<Integer>转型为ArrayList<Number>类型后,这个ArrayList<Number>就可以接受Float类型,因为Float是Number的子类。但是,ArrayList<Number>实际上和ArrayList<Integer>是同一个对象,也就是ArrayList<Integer>类型,它不可能接受Float类型, 所以在获取Integer的时候将产生ClassCastException。
因为sort函数的排序接口使用了泛型,待排序的元素必须实现Comparable<T>这个反省接口
public interface Comparable<T> {/*** 返回-1: 当前实例比参数o小* 返回0: 当前实例与参数o相等* 返回1: 当前实例比参数o大*/int compareTo(T o);}
所以我们在自定义的Class中要实现Array.sort()功能,必须使用implements来实现Comparable<T>接口
// sortimport java.util.Arrays;public class Main {public static void main(String[] args) {Person[] ps = new Person[] {new Person("Bob", 61),new Person("Alice", 88),new Person("Lily", 75),};Arrays.sort(ps);System.out.println(Arrays.toString(ps));}}class Person implements Comparable<Person> {String name;int score;Person(String name, int score) {this.name = name;this.score = score;}public int compareTo(Person other) {return this.name.compareTo(other.name);}public String toString() {return this.name + "," + this.score;}}
