這兩者之間有什麼區別。爲什麼後者會創建一個新的可序列化的類?ArrayList <>()和ArrayList <>(){}之間的區別
new ArrayList<Clazz>()
創建一個新的空ArrayList
Eclipse中顯示:The serializable class does not declare a static final serialVersionUID field of type long
這兩者之間有什麼區別。爲什麼後者會創建一個新的可序列化的類?ArrayList <>()和ArrayList <>(){}之間的區別
new ArrayList<Clazz>()
創建一個新的空ArrayList
Eclipse中顯示:The serializable class does not declare a static final serialVersionUID field of type long
在第一個例子,你創建一個ArrayList
實例。在後者中,您正在創建ArrayList
的匿名子類的實例。通常你會覆蓋子類中的一個或多個方法,
,否則創建這樣的方法沒有多大意義。
正如John Skeet指出的那樣,創建一個通用類型的匿名子類有一個原因,參見his answer。
Eclipse的警告,爲了堅持Serializable
規格(ArrayList
是Serializable
,所以它的所有子類都太),你應該定義在子類中的獨特serialVersionUID
從反序列化過程可以保證類定義自序列化以來並沒有明顯改變(很明顯,您自己已決定新定義與舊定義不兼容,因此您可以通過更改serialVersionUID
來表達這一事實)。如果你永遠不會序列化這個列表,那麼這個警告並不重要。
正如Joonas所說,在第二個例子中,你正在創建一個匿名的內部類。然而,是的一個理由,即使你沒有重寫任何方法等等:它允許你在執行時確定ArrayList
的元素類型 - 因爲匿名內部類的超類是ArrayList<Clazz>
而不僅僅是ArrayList
。
這是類型文字在Guice中的工作方式。這是一個醜陋的黑客,但它完成了工作...
它如何讓他在運行時確定元素類型? –
@LouisRhys:如果你在實例上調用'getClass()',它會給出匿名類。如果您然後調用'getGenericSuperclass()''Type'將會有適當的信息。 –
匿名子類。爲什麼我如此盲目...... –