2014-12-22 157 views
4

下面的代碼:爲什麼這個代碼編譯? (Java的泛型方法)

import java.util.*; 

public final class JavaTest { 
    public static <T extends Comparable<? super T>> int max(List<? extends T> list, int begin, int end) { 
     return 5; 
    } 

    public static void main(String[] args) { 
     List<scruby<Integer>> List = new ArrayList<>(); 
     JavaTest.<scruby>max(List, 0, 0); //how does this compile?, scruby doesn't meet 
     //T extends Comparable<? super T> 
    } 
} 

class scruby<T> implements Comparable<String>{ 
    public int compareTo(String o) { 
     return 0; 
    } 
} 

如何聲明JavaTest.max(列表,0,0)編譯?如何scruby滿足

T extends Comparable <? super T> 

它實現Comparable<String>這是不是一個超級型scruby的?如果將其更改爲scruby<Integer>,它將不會編譯併發出錯誤。那麼爲什麼現在編譯?爲什麼原始類型編譯?

+0

不能看到有人downvoting這點?至少對我來說,這似乎是合法的問題。 –

+2

不,它沒有擴展'String'它擴展'Integer'因爲'List > List = new ArrayList <>();'然後它沒有使用它的'implements Comparable '它使用的方法是[ compareTo](http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#compareTo(java.lang.Integer))繼承自'Integer'的方法 – chancea

+0

對不起,我的意思是它實現可比較的和字符串不是scruby的超級用戶。它如何從Integer繼承任何東西? – nhooyr

回答

3
JavaTest.<scruby>max(List, 0, 0); 

scruby是原始類型。這抑制了一些類型檢查。

您應該添加所有需要的類型參數:

JavaTest.<scruby<Integer>>max(List, 0, 0); 

或者只是讓Java的推斷他們:

JavaTest.max(List, 0, 0); 
+0

哦,那是因爲它是原始類型,它只是不檢查? O.O 有趣,謝謝你的幫助! – nhooyr

+1

是的。基本上,只要引入一個原始類型,除了警告之外,所有與其相關的泛型類型檢查都會被抑制,並且檢查會被放到運行時間,就像在泛型之前的那些日子一樣。請記住,Java期望使用原始類型僅限於舊的舊版代碼。 – RealSkeptic