2011-04-07 172 views
2

這是什麼工作,沒有類型?Java和泛型類

ArrayList l = new ArrayList(); 

難道它只是默認爲object類型,如果你不指定類型,並投下一切反對呢?

在api中,它說ClassType(不會顯示)小於大於符號的問號是什麼意思。

+0

我認爲它默認是鍵入'Object',Java中的每一個類都繼承它。 – bdares 2011-04-07 07:58:36

+0

@bdares:不,ArrayList與ArrayList newacct 2011-04-07 09:23:13

回答

3

如果您不指定類型並且將所有對象都轉換爲對象,是否僅僅是默認的類型對象?

是的。這幾乎是正確的。

未提供類型參數的通用類型(如ArrayList)稱爲原始類型。原始類型涵蓋在官方線索Type Erasure

例如,Box<String>被轉換成鍵入Box,這就是所謂的原料種類 - 原始類型是一個泛型類或接口的名稱沒有任何類型的參數。這意味着您無法找到泛型類在運行時使用的對象類型。

[...]

類型擦除的存在使得新的代碼可能會繼續與遺留代碼的接口。 由於任何其他原因使用原​​始類型被認爲是不好的編程習慣,應儘可能避免。

*)你可以把任何ObjectArrayList,但@newacct在評論中指出,ArrayList是不被認爲一樣ArrayList<Object>,因爲ArrayList(和ArrayList<?> BTW)是兩個超類型的ArrayList<WhatEver>,而ArrayList<Object>不是。

+0

在api中它意味着什麼說有一個問號作爲一個泛型? – rubixibuc 2011-04-07 08:03:03

+0

'ArrayList '是'ArrayList '的超類型,即它可以用作參數的類型,其中您不知道數組列表包含的內容。你可以閱讀更多[這裏](http://download.oracle.com/javase/tutorial/extra/generics/wildcards.html)。 – aioobe 2011-04-07 08:04:53

+0

當我使用Class.forName(「Class」)時,它應該返回一個具有指定泛型類的類Class??<(反過來它們不能讓它們顯示)。但是看起來evetyone只是使用class。這是一回事嗎? – rubixibuc 2011-04-07 08:08:03

7

這就是所謂的原始類型。儘可能避免原始類型,因爲它們會降低類型安全性。

基本上他們是爲了向後兼容,所以當泛型被引入時,現有的代碼仍然被編譯。與以往一樣,請參閱Java Generics FAQ瞭解更多詳情。

注意,使用原始類型是一樣使用與Object一個類型參數類型,作爲原始類型有所有痕跡從他們有效的API中刪除仿製藥的 - 使用其他甚至泛型方法類型參數。這是什麼使他們危險的一部分。

+0

+1:我從來沒有想過用原始類型的通用方法進行處理......好提示 – 2011-04-07 08:04:13

1

是的。

這就是Java在泛型引入之前的工作方式。而實際上,這是還是它是如何工作的,引擎蓋下。編譯器執行基本的類型檢查,然後執行類型擦除,所以您留下的字節碼將與上述相同。

+0

+1指出泛型是在編譯時執行的,而不是運行時 – CodeClimber 2011-04-07 08:39:20

0

您會在安裝JDK的目錄的根目錄中找到一個zip文件。在那裏,有一個src.zip。

我使用eclipse作爲IDE。在那you can attach the source所以當你推CTRL + SHIFT + T並鍵入ArrayList時,你將能夠看到它自己的來源;) 實際上它也是一個很好的方式來看看更多專家的ppl寫源代碼:)