[英]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 {}
}
因為Node
是LinkedList<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
),因為您無法使用LinkedList
的T
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.