2011-10-17 98 views
11

這兩者之間有什麼區別。爲什麼後者會創建一個新的可序列化的類?ArrayList <>()和ArrayList <>(){}之間的區別

new ArrayList<Clazz>() 

創建一個新的空ArrayList

​​

Eclipse中顯示:The serializable class does not declare a static final serialVersionUID field of type long

回答

13

在第一個例子,你創建一個ArrayList實例。在後者中,您正在創建ArrayList的匿名子類的實例。通常你會覆蓋子類中的一個或多個方法, ,否則創建這樣的方法沒有多大意義。 正如John Skeet指出的那樣,創建一個通用類型的匿名子類有一個原因,參見his answer

Eclipse的警告,爲了堅持Serializable規格(ArrayListSerializable,所以它的所有子類都太),你應該定義在子類中的獨特serialVersionUID從反序列化過程可以保證類定義自序列化以來並沒有明顯改變(很明顯,您自己已決定新定義與舊定義不兼容,因此您可以通過更改serialVersionUID來表達這一事實)。如果你永遠不會序列化這個列表,那麼這個警告並不重要。

+2

匿名子類。爲什麼我如此盲目...... –

7

正如Joonas所說,在第二個例子中,你正在創建一個匿名的內部類。然而,的一個理由,即使你沒有重寫任何方法等等:它允許你在執行時確定ArrayList的元素類型 - 因爲匿名內部類的超類是ArrayList<Clazz>而不僅僅是ArrayList

這是類型文字在Guice中的工作方式。這是一個醜陋的黑客,但它完成了工作...

+0

它如何讓他在運行時確定元素類型? –

+1

@LouisRhys:如果你在實例上調用'getClass()',它會給出匿名類。如果您然後調用'getGenericSuperclass()''Type'將會有適當的信息。 –

相關問題