泛型就是定义一种模板,例如ArrayList<T>,然后在代码中为用到的类创建对应的ArrayList<类型>

    1. ArrayList<String> strList = new ArrayList<String>();

    既实现了编写一次,万能匹配,又通过编译器保证了类型安全:这就是泛型。
    特别注意:不能把ArrayList<Integer>向上转型为ArrayList<Number>List<Number>。观察一下代码:

    1. // 创建ArrayList<Integer>类型:
    2. ArrayList<Integer> integerList = new ArrayList<Integer>();
    3. // 添加一个Integer:
    4. integerList.add(new Integer(123));
    5. // “向上转型”为ArrayList<Number>:
    6. ArrayList<Number> numberList = integerList;
    7. // 添加一个Float,因为Float也是Number:
    8. numberList.add(new Float(12.34));
    9. // 从ArrayList<Integer>获取索引为1的元素(即添加的Float):
    10. Integer n = integerList.get(1); // ClassCastException!

    我们把一个ArrayList<Integer>转型为ArrayList<Number>类型后,这个ArrayList<Number>就可以接受Float类型,因为FloatNumber的子类。但是,ArrayList<Number>实际上和ArrayList<Integer>同一个对象,也就是ArrayList<Integer>类型,它不可能接受Float类型, 所以在获取Integer的时候将产生ClassCastException


    因为sort函数的排序接口使用了泛型,待排序的元素必须实现Comparable<T>这个反省接口

    1. public interface Comparable<T> {
    2. /**
    3. * 返回-1: 当前实例比参数o小
    4. * 返回0: 当前实例与参数o相等
    5. * 返回1: 当前实例比参数o大
    6. */
    7. int compareTo(T o);
    8. }

    所以我们在自定义的Class中要实现Array.sort()功能,必须使用implements来实现Comparable<T>接口

    1. // sort
    2. import java.util.Arrays;
    3. public class Main {
    4. public static void main(String[] args) {
    5. Person[] ps = new Person[] {
    6. new Person("Bob", 61),
    7. new Person("Alice", 88),
    8. new Person("Lily", 75),
    9. };
    10. Arrays.sort(ps);
    11. System.out.println(Arrays.toString(ps));
    12. }
    13. }
    14. class Person implements Comparable<Person> {
    15. String name;
    16. int score;
    17. Person(String name, int score) {
    18. this.name = name;
    19. this.score = score;
    20. }
    21. public int compareTo(Person other) {
    22. return this.name.compareTo(other.name);
    23. }
    24. public String toString() {
    25. return this.name + "," + this.score;
    26. }
    27. }