2013-05-20 77 views
7

這是對chrert的問題Generic classes with Collection getter of other types的後續處理。如果你能拿出一個更好的標題我的問題,可隨時編輯:使用通用方法獨立於通用類型的原始類型

下面的代碼包含一個通用類GenericClass<T>返回類型爲T的方法,並返回類型爲Collection<String>,這顯然是獨立的另一種方法T。現在,如果我實例化一個原始的GenericClass(我永遠不會這麼做,所以這個問題更多的是一個理論問題,爲了幫助理解發生了什麼),那麼在增強for循環中調用該方法將不起作用,因爲所有通用類型信息在使用原始類型時似乎都會丟失。但是,當在一個任務中調用同樣的方法時,它會起作用(它警告類型不安全,但會編譯)。

在我看來,要麼兩者都不應該工作,要麼都應該工作。我不明白爲什麼一個人工作,而另一個不是。你有沒有提示,或者知道解釋這種行爲的JLS的任何部分?

public class GenericClass<T> { 

    T doSomething() { 
     return null; 
    } 

    Collection<String> getCollection() { 
     return Collections.emptyList(); 
    } 

    public static void main(String[] args) { 
     GenericClass raw = new GenericClass(); 
     // This will not compile (Error message below) 
     for (String str : raw.getCollection()) { 
      // Type mismatch: cannot convert from element type Object to String 
     } 
     // This is only a warning: 
     // Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<String> 
     Collection<String> coll = raw.getCollection(); 
     for (String string : coll) { 
      // works just fine 
     } 
    } 
} 

有一個相關的問題,其中,在這裏接受的答案一起,解釋這是怎麼回事相當不錯:Why won't this generic java code compile?

回答

4

在第一種情況下,raw.getCollection()返回原CollectionJLS 14.14.2指定類型檢查針對增強for循環:

如果Type(在FormalParameter生產)爲參考的類型,然後是的TargetType類型;否則,TargetType是I,或Object的類型參數的捕獲轉換的上限,如果我是原始的。

(強調)

在第二種情況下,你明確地指定一個原始類型到一個通用的類型,它是允許有像正常的警告。

+0

對第二種情況的強調和解釋使其非常清楚。謝謝! – jlordo