<T extends Comparable<T>>代表T實現了Comaprable<T>接口,此條件強制約束,泛型對象必須直接實現Comparable<T>(所謂直接就是指不能經過繼承或其餘方式)java
<T extends Comparable<? super T>> 代表T的任意一個父類實現了Comparable<? super T>接口,其中? super T表示 ?泛型類型是T的父類(固然包含T),所以包含上面的限制條件,且此集合包含的範圍更廣ide
案例以下函數
// 有限制的泛型 只容許實現Comparable接口的參數類型 // 從集合中找出最小值 public static <T extends Comparable<T>> T min(List<T> list) { Iterator<T> iterator = list.iterator(); T result = iterator.next(); while (iterator.hasNext()) { T next = iterator.next(); if (next.compareTo(result) < 0) { result = next; } } return result; } // <T extends Comparable<? super T>> 限制 // 此方法 多一個 ? super T 約束 代表能夠是T或者T的某個父類實現Comparable接口 public static <T extends Comparable<? super T>> T min2(List<T> list) { Iterator<T> iterator = list.iterator(); T result = iterator.next(); while (iterator.hasNext()) { T next = iterator.next(); if (next.compareTo(result) < 0) { result = next; } } return result; }
Dog.javathis
package com.effectJava.Chapter2; public class Dog extends Animal { private int age; private String name; private String hobby; public Dog(int id,int age, String name, String hobby) { super(id); this.age = age; this.name = name; this.hobby = hobby; } public void setName(String name) { this.name = name; } public void setHobby(String hobby) { this.hobby = hobby; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public String getHobby() { return hobby; } public int getAge() { return age; } }
Animal.java對象
package com.effectJava.Chapter2; public class Animal implements Comparable<Animal> { // 惟一標識動物的id protected int id; public Animal(int id) { this.id = id; } public Animal() { } public void setId(int id) { this.id = id; } public int getId() { return id; } @Override public int compareTo(Animal o) { return this.getId() - o.getId(); } }
運行main函數blog
List<Dog> dogs = new ArrayList<>(); dogs.add(new Dog(1, 1, "1", "1")); dogs.add(new Dog(2, 2, "2", "2")); dogs.add(new Dog(3, 3, "3", "3")); // 編譯錯誤 因爲Dog沒有直接實現Comparable<Dog>接口 min(dogs); // 因爲Dog父類Animal實現了Comparable<Dog>接口 min2(dogs);