2009-06-29 134 views

回答

14

這是泛型的使用。檢查此intro了。然後不要忘記閱讀tutorial

摘錄如下(其中使用流延的比較相對於使用泛型):

當看到代碼<類型>,讀它 爲「類型」; 以上的聲明表示爲「字符串c的集合」。使用泛型的 代碼更清晰並且更安全。我們已經消除了不安全的 演員和一些額外的 括號。更重要的是,我們有 搬離其 署名評論的 方法的規範的一部分,所以編譯器可以在編譯時該類型 約束不是在運行時 違反驗證 。由於程序編譯 沒有警告,我們可以確定 確定它不會在運行時拋出 ClassCastException。 使用泛型的效果, 特別是在大型程序中, 改進了可讀性和健壯性。

例如,列表的接口是

public interface List<E> { 
    void add(E x); 
    Iterator<E> iterator(); 
} 

這意味着你可以建立,其內容都是相同的顯式類型的(不僅是Object類型)的列表,即使你有自己定義類型。所以,如果你創建一個名稱類,你可以寫

List<Name> nameList = new List<Name>(); 

,然後用實例名稱填寫,並直接從中檢索名稱實例無需進行轉換或以其他方式不用擔心,因爲您總能獲得無論是名稱實例或null返回,從來沒有一個不同類型的實例。

更重要的是,您不能在這樣的List中插入與Name實例不同的任何東西,因爲它在編譯時會失敗。

nameList.add(false); //Fails! 
nameList.add(new Name("John","Smith")); //Succeeds supposing Name has a 
             //firstName, lastName constructor 
+0

我讀`列表`作爲「類型列表」,就好像T是Type的簡寫。我注意到``在很多代碼中。它是否適用於任何事物?或者我應該只讀它作爲「收集的Es」 – Aust 2016-03-09 06:11:09

16

這意味着你正在處理類型爲E的項目集合。想象一下,你有一杯茶。取而代之的茶,它也可以容納咖啡等,是很有意義的描述杯如一個普通的實體:

class Cup<T> { … } 

現在你可以填補它,無論是用咖啡或茶(或別的東西):

Cup<Tea> cuppa = new Cup<Tea>(); 
Cup<Coffee> foamee = new Cup<Coffee>(); 

爲了達到此目的,TeaCoffee也需要在程序中定義的類型。

這是一個編譯時限制您的代碼。從(相當無用的)杯子例子回來,集合(數組,列表...)通常包含一個類型的項目,例如,整數或字符串。泛型幫助你用Java表達這個:

Collection<String> strList = new ArrayList<String>(); 
strList.add("Foobar"); // Works. 
strList.add(42);  // Compile error! 

注意上面的編譯錯誤?您只有在使用泛型時纔會這樣做。下面的代碼也適用,但不會給出漂亮的錯誤信息:

Collection strList = new ArrayList(); 
strList.add("Foobar"); // Works. 
strList.add(42);  // Works now. Do we really want this?! 
+0

很好的解釋:) – Johanna 2009-06-29 07:04:09