2011-07-07 340 views
88

我目前正在學習Java,最近被尖括號難倒(<>)。他們究竟是什麼意思?什麼是<T>(尖括號)在Java中的含義?

public class Pool<T>{ 
    public interface PoolFactory<T>{ 
     public T createObject(); 
    } 
    this.freeObjects= new ArrayList<T>(maxsize) 
} 

<T>是什麼意思?這是否意味着我可以創建一個T類型的對象?

+8

谷歌Java的泛型 –

+4

我覺得很難解析你的代碼。開始時沒有縮進,並且有兩個開放的大括號,並且只有一個關閉。 'T createObject'應該在Pool還是PoolFactory中? 'this.freeObjects = ...'應該是什麼?那是一個單獨的例子嗎?在那裏擁有它是非法的;它必須在一個方法內。 – mgiuca

+0

如果有人正在尋找有關'<>'(鑽石算子)的信息,可以像'List list = new ArrayList <>();'一樣使用,請訪問https://docs.oracle.com/javase/7/docs /technotes/guides/language/type-in​​ference-generic-instance-creation.html。 – Pshemo

回答

4

<>用於表示Java中的generics

T是本例中的一個類型參數。和否:實例化是你不能T做的幾件事情之一。

除了上面鏈接的教程Angelika Langers Generics FAQ是關於這個話題的很好的資源。

6

被稱爲通用類型。您可以這樣實例化對象池:

PoolFactory<Integer> pool = new Pool<Integer>(); 

通用參數只能是引用類型。所以你不能使用像int或double或者char或其他基本類型這樣的基本類型。

101

<T>通用,通常可以讀爲「T型」。它取決於<左側的類型>它的實際含義。

我不知道PoolPoolFactory是什麼,但你也提到ArrayList<T>,這是一個標準的Java類,所以我會談談這一點。

通常情況下,你不會在那裏看到「T」,你會看到另一種類型。因此,如果您看到例如ArrayList<Integer>,那意味着「的Integer s」。例如,許多類使用泛型來約束容器中元素的類型。另一個例子是HashMap<String, Integer>,意思是「一個帶有String鍵和Integer值的地圖。」

您的泳池示例有點不同,因爲您在定義了一類。因此,在這種情況下,您正在創建一個類,其他人可以使用特定類型來實例化T。例如,我可以使用您的類定義創建類型爲Pool<String>的對象。這將意味着兩件事情:

  • Pool<String>將有一個createObject方法返回String秒的接口PoolFactory<String>
  • 在內部,Pool<String>將包含Strings的ArrayList

這是個好消息,因爲在其他時間,我可以一起去,並創建一個Pool<Integer>這將使用相同的代碼,但是有Integer無論你在源看到T

16

它與java中的泛型相關。如果我提到ArrayList<String>這意味着我只能將String類型對象添加到該ArrayList。

在Java泛型的兩個主要好處是:

  1. 降低鑄件的數量在你的程序中,從而減少在你的程序中潛在的錯誤的數量。
  2. 提高代碼清晰度
1
通用

類是一類類的,在一個數據類型作爲參數它的創建時。此類型參數使用尖括號指定,並且類型可以在每次實例化類的新實例時更改。例如,讓我們創建Employee對象一個ArrayList,另一個是公司對象

ArrayList<Employee> employees = new ArrayList<Employee>(); 
ArrayList<Company> companies = new ArrayList<Company>(); 

你會發現,我們使用相同的ArrayList類創建兩個列表,我們的員工和公司類型使用角度傳括號。讓一個泛型類能夠處理多種類型的數據可以減少執行類似任務的許多類。泛型也有助於通過給所有的強類型減少bug,這有助於編譯器指出錯誤。通過爲ArrayList指定一個類型,如果您嘗試將Employee添加到公司列表中,則編譯器會引發錯誤,反之亦然。

10

這很簡單。這是J2SE 5中引入的新功能。在類名後面指定尖括號意味着您正在創建可以容納任何類型數據的臨時數據類型。

例子:

class A<T>{ 
    T obj; 
    void add(T obj){ 
     this.obj=obj; 
    } 
    T get(){ 
     return obj; 
    } 
} 
public class generics { 
    static<E> void print(E[] elements){ 
     for(E element:elements){ 
      System.out.println(element); 
     } 
    } 

    public static void main(String[] args) { 
     A<String> obj=new A<String>(); 
     A<Integer> obj1=new A<Integer>(); 
     obj.add("hello"); 
     obj1.add(6); 
     System.out.println(obj.get()); 
     System.out.println(obj1.get()); 

     Integer[] arr={1,3,5,7}; 
     print(arr); 
    } 
} 

相反的<T>,實際上你可以寫任何東西,它的工作方式相同。試着寫<ABC>代替<T>

這僅僅是爲了方便起見:

  • <T>被稱爲任何類型
  • <E>作爲元素類型
  • <N>作爲號碼類型
  • <V>作爲值
  • <K>作爲關鍵

但是你可以將它命名爲任何你想要的東西,這並不重要。

此外,Integer,String,Boolean等都是Java的包裝類,它們有助於在編譯期間檢查類型。例如,在上面的代碼中,obj的類型是String,因此您無法向其中添加任何其他類型(嘗試obj.add(1),它會投出錯誤)。同樣,obj1Integer類型,您不能添加任何其他類型(嘗試obj1.add("hello"),錯誤將在那裏)。

相關問題