我讀了一些代碼,並想知道爲什麼下面將工作:<Item>?
這是一個Stack類:public class Stack<Item> { ***** }
然後在main方法的類的實例被創建: Stack<String> s = new Stack<String>();
通用堆棧類聲明中的Item
意味着什麼?它是標準的Java Item
類,還是Java泛型的命名約定?我認爲String
需要是這個Item
的子類才能使代碼正常工作,對吧?
我讀了一些代碼,並想知道爲什麼下面將工作:<Item>?
這是一個Stack類:public class Stack<Item> { ***** }
然後在main方法的類的實例被創建: Stack<String> s = new Stack<String>();
通用堆棧類聲明中的Item
意味着什麼?它是標準的Java Item
類,還是Java泛型的命名約定?我認爲String
需要是這個Item
的子類才能使代碼正常工作,對吧?
在
public class Stack<Item>
Item
是正式類型參數名稱。它不對應於任何特定的java類,因此沒有隱含的包名稱。
在
Stack<MyItem> stack = new Stack<MyItem>();
MyItem
爲實際對於類型Item
結合,所以必須對應於一個實際的類,並且具有一個隱含的包。
"formal" and "actual" parameters之間的區別是一樣的x
及以下42
之間的區別:
int f(int x) { ... } // x is a formal parameter name
System.out.println(f(42)); // 42 is the actual parameter to which the formal x is bound.
感謝邁克 - 這很有道理。所以從一個java語法的角度來看,我可以使用任何名稱來替換item,對吧?例如,我可以使用「東西」,「東西」等作爲形式類型參數的名稱,並且相同的代碼將編譯和工作? – user2210021 2013-03-26 03:52:50
@ user2210021,是的。你可以用不同的名稱替換'f'中的''x'',它也可以工作,只要你在類的主體中一致地替換它的使用,你可以用任何Java標識符替換'Item' 。 – 2013-03-26 04:47:52
Item
似乎並沒有成爲一個標準的Java類。它可能只是一個任意泛型類型,在這種情況下,可以使用特定的String
類型而不會出現任何問題。
你是指這個Stack類的實現嗎?
http://algs4.cs.princeton.edu/13stacks/Stack.java.html
我會認爲字符串需要這個項目的一個子類,以便代碼工作,對不對?
不一定。瀏覽上面評論中給出的Java跟蹤。可以定義泛型,以便可以「插入」類並使用泛型類型在整個類或方法中引用它。
P.S:請注意,泛型只在編譯期間執行。它們不存在於字節碼中。
謝謝 - 所以我可以使用任何任意名稱作爲正式的類型參數? – user2210021 2013-03-26 03:56:36
敢於嘗試。你只能獲得更多的經驗:) – 2013-03-26 03:57:22
「你的代碼」在哪裏代碼? – MondKin 2013-03-26 03:40:42
什麼是Java物品類? – smk 2013-03-26 03:40:50
它編譯? – 2013-03-26 03:41:42