2013-03-26 31 views
0

我讀了一些代碼,並想知道爲什麼下面將工作:<Item>?

這是一個Stack類:public class Stack<Item> { ***** }

然後在main方法的類的實例被創建: Stack<String> s = new Stack<String>();

通用堆棧類聲明中的Item意味着什麼?它是標準的Java Item類,還是Java泛型的命名約定?我認爲String需要是這個Item的子類才能使代碼正常工作,對吧?

+1

「你的代碼」在哪裏代碼? – MondKin 2013-03-26 03:40:42

+0

什麼是Java物品類? – smk 2013-03-26 03:40:50

+2

它編譯? – 2013-03-26 03:41:42

回答

2

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. 
+0

感謝邁克 - 這很有道理。所以從一個java語法的角度來看,我可以使用任何名稱來替換item,對吧?例如,我可以使用「東西」,「東西」等作爲形式類型參數的名稱,並且相同的代碼將編譯和工作? – user2210021 2013-03-26 03:52:50

+0

@ user2210021,是的。你可以用不同的名稱替換'f'中的''x'',它也可以工作,只要你在類的主體中一致地替換它的使用,你可以用任何Java標識符替換'Item' 。 – 2013-03-26 04:47:52

1

Item似乎並沒有成爲一個標準的Java類。它可能只是一個任意泛型類型,在這種情況下,可以使用特定的String類型而不會出現任何問題。

你是指這個Stack類的實現嗎?

http://algs4.cs.princeton.edu/13stacks/Stack.java.html

我會認爲字符串需要這個項目的一個子類,以便代碼工作,對不對?

不一定。瀏覽上面評論中給出的Java跟蹤。可以定義泛型,以便可以「插入」類並使用泛型類型在整個類或方法中引用它。

P.S:請注意,泛型只在編譯期間執行。它們不存在於字節碼中。

+0

謝謝 - 所以我可以使用任何任意名稱作​​爲正式的類型參數? – user2210021 2013-03-26 03:56:36

+0

敢於嘗試。你只能獲得更多的經驗:) – 2013-03-26 03:57:22