簡體   English   中英

Java中的<>做什么?

[英]What does <> do in Java?

我知道如果你想要一個列表(例如)你創建它像:

List<String>

如果要創建通用類型的列表,可以這樣做:

MyList<T>

那么<>做的唯一事情是將對象與容器或列表耦合在一起嗎? 它有其他用途嗎? 它實際上做了什么? 在另一篇文章中讀到如何將靜態方法放入泛型類型對於類型安全來說是一件壞事,那么這個錯誤的代碼是什么?

public class LinkList<T> {

private final T t;
private final LinkList<T> next;

public LinkList(T t, LinkList<T> next){
    this.t = t;

    this.next = next;
}
// Creates list from array of T
public static <T> LinkList<T> getList(T[] t){
    if(t == null){
        return null;
    }
    LinkList linkList = null;
    for(int i = t.length-1; i >= 0; i--){
        linkList = new LinkList(t[i], linkList);
    }
    return linkList;
}

public T element() {
    return t;
}

public LinkList<T> getNext() {
    return next;
}

}

<>幫助編譯器驗證類型安全性。

編譯器可以確保List<MyObj>持有類型的對象MyObj在編譯時間而不是運行時間。

泛型主要用於編譯時類型安全的目的。 由於類型擦除,所有通用信息在編譯后將被具體類型替換。

當你把<>和一個類型放在里面時,它用於將潛在的運行時異常轉換為編譯錯誤。

以此代碼為例,沒有泛型

ArrayList stringList = new ArrayList();
stringList.add("string");
stringList.add(3.4);
String s = (String) stringList.get(1);

//這將編譯並產生運行時錯誤,將字符串比較為雙倍。

如果你添加泛型,你可以在編寫時找到這些錯誤。

考慮以下代碼:

ArrayList<String> stringList = new ArrayList<String>(); // Since Java 7 you can write - new ArrayList<>()
stringList.add("string"); // OK
stringList.add(3.4); // Would not compile!

這樣,您可以在編譯時捕獲與類型相關的錯誤。

編譯器本身並不關心您是否使用了泛型。 它會在編譯時刪除所有這些內容,並且就像您沒有使用泛型一樣。 但是,如果您首先遇到編譯錯誤,它將不允許您編譯。

我也注意到我沒有回答你關於代碼的問題。

當你做這樣的事情

class LinkedList<T> {
....
.... 
}

你告訴編譯器這個類支持泛型,在這種情況下,我可以做我上面所說的

你能做到的

LinkedList<String> list = new LinkedList<String>();

現在,在你的類中,它表示T表示就像它表示String ,因此只允許添加和編寫字符串。

<>用於稱為泛型的很酷的功能。

在Java 5之前,泛型不存在。 ArrayList這樣的集合返回並操縱了Objects 例如,當您知道只存儲String時,問題就在於此。 但是如果你在所有類中使用Objects ,你不僅需要使用惱人的轉換( String blah = (String) list.get(9); ),而且如果你出錯並在你的列表中放入一個Integer ,你的程序將ClassCastException和刻錄。

Java 5用泛型解決了這個問題,所以現在你可以說ArrayList<String>表示你只會在這個ArrayList使用String 但是如果你需要制作ArrayList<Supercalifragilisticexpealidocious>呢? 顯然,打字並不是一種愉快的體驗,尤其是當您需要輸入時

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<Supercalifragilisticexpealidocious>();

宣布其中之一。 此外,它可能會導致拼寫錯誤,特別是這種大小的類型參數; 在某些時候,你一定會錯誤輸入一兩個字母,使你的程序cannot find symbol和刻錄 - 或者更糟糕的是,默默地使用錯誤的類並導致邏輯錯誤。

Java 7引入了普通的<>語法。 它被稱為菱形運算符 ,因此您無需重新鍵入賦值運算符右側的類型參數( <> )。 因此,

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<Supercalifragilisticexpealidocious>();

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<>();

這意味着重新輸入Supercalifragilisticexpealidocious時間要少得多。

希望這可以幫助!

<>可以用於任何你想要的類,而不僅僅是容器。 這些只是最常見的,因為我們希望能夠在容器中存儲我們想要的任何類型的對象並且仍然保持類型安全。 為了更深入地理解這一點,您應該研究泛型及其用途。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM