簡體   English   中英

鏈接列表泛型java

[英]Linked list Generics java

所以我剛開始學習java泛型,我的老師給了我們這段代碼

public class LinkedList<T> {
    class Node<T>{
        T info;
        Node<T> next;
    }

    Node<T> head = new Node<T>();
/*
and here are supposed to be all the methods like add,remove... that use Class Node
*/

}

所以問題在於這一行

class Node<T>{

<T> Eclipse給我“類型參數T隱藏類型T”警告,所以我刪除並使用

public class LinkedList<T> {
    class Node{
        T info;
        Node next;
    }

    Node head = new Node();
/*
and here are supposed to be all the methods like add,remove... that use Class Node
*/

}

我現在沒有得到任何警告,但它讓我想知道代碼是否做同樣的事情? 如果沒有什么區別? 有人可以向我解釋一下這個區別,還是指出了正確的方向? 非常感謝。

這與具有與成員變量同名的局部變量或與超類中具有相同名稱的子類中的成員變量非常相同:執行此操作是合法的,只是混淆了哪個T你指的是。

您實際上不需要Node上的類型變量:

public class LinkedList<T> {
  class Node {}
}

因為NodeLinkedList<T>的內部類,所以它可以使用父類定義的T 這就是你想要的:列表的節點應該是與包含List相關的類型(例如,你不會在LinkedList<String>Node<Integer> )。

您可以使Node靜態:

public class LinkedList<T> {
  static class Node<T> {}
}

除了泛型,這很好,因為這意味着你的每個Node實例都沒有包含對LinkedList的引用 - 你幾乎肯定不需要它。

現在它們是單獨的類型變量。 但是要注意在這里,現在是哪個混亂T你的意思。 你可以通過調用其他類型的變量來更清楚 - 比方說, S 然后,您不能將LinkedList上的類型與Node上的類型混淆。

代碼運行時實際上沒有T 通用類型聲明是Java 8時的編譯時結構。實際代碼將完全刪除泛型類型聲明,並在沒有它的情況下運行。

至於你擁有的代碼,當你使用泛型類型聲明在類中聲明內部非靜態類時,該內部類將使用與其外部類相同的類型。 這就是為什么

class Node<T> {
  T value;
  Node<T> next;
}

據說是“隱藏通用型簽名”。

由於外部類是Generic類,因此內部的所有內容都將依賴於該值,如果外部類已經是泛型類,則內部類不需要特定的泛型類

T被稱為“有界類型參數”。 所以當你想限制可以在參數化類型中用作類型參數的類型時。 所以下面的類與參數綁定。

public class LinkedList<T> {
   class Node<T> {

              }
        }

由於Node類未聲明為static,因此任何Node對象都具有對其中創建的LinkedList的隱式引用。 鑒於此,在外部類LinkedList聲明的T類型參數也在Node類中使用。

例如,如果在LinkedList<String>的范圍內創建Node ,則它將隱式地為Node<String>

另一方面,如果Node類被聲明為static ,則必須將其聲明為Node<T> (或任何其他符號而不是T ),因為您無法使用LinkedListT類型。

暫無
暫無

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

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