2013-02-21 64 views
1

在一個靜態工具中考慮一個通用的min方法,它意味着返回一個集合中的最小元素。爲什麼我們需要將其聲明爲通配符類型爲類型參數提供了多大的靈活性?

public static <T extends Comparable<? super T>> T min(Set<? extends T> producerSet) 

會有什麼,如果我們不是把它聲明爲

public static <T extends Comparable<T>> T min(Set<? extends T> producerSet) 

什麼靈活性的類型參數外卡型給了我這裏的問題?

+3

驅動式點評:這應該是介於安格莉卡朗格的泛型常見問題,因爲一切都是。 (當涉及到泛型的問題,該文件是強制性閱讀。) – millimoose 2013-02-21 15:29:14

+6

哎呀,這是在泛型教程:http://docs.oracle.com/javase/tutorial/extra/generics/morefun.html - 一個例子是,如果如果你沒有使用'?Animal implements Comparable ',並且'Cat extends Animal',你有類嗎? super T',那麼你不能在'List '上調用'min()',因爲它需要項目類型與它本身相媲美,而你只需要它與自己或超類型相媲美。 – millimoose 2013-02-21 15:32:19

回答

0

這涵蓋了T是Comparable的實現者的子類的情況。考慮以下幾點:

public static class A implements Comparable<A> { 

    public int compareTo(A o) { 
     return 0; 
    } 
} 
public static class B extends A {} 

public static <T extends Comparable<T>> T min(Set<? extends T> producerSet) { 
    return null; 
} 

public static void main(String[] args) { 
    Set<B> set = new HashSet<B>(); 
    min(set); // incompatible with method signature 
} 
相關問題