2011-10-17 13 views
11

これらの2つの違いは何ですか?なぜ後者は新しいシリアライズ可能なクラスを作成するのですか?ArrayList <>()とArrayList <>(){}の相違点

new ArrayList<Clazz>() 

はEclipseの新しい空のArrayList

​​

を作成示しています。最初の例でThe serializable class does not declare a static final serialVersionUID field of type long

答えて

13

を、あなたはArrayListインスタンスを作成しています。後者では、ArrayListの匿名サブクラスのインスタンスを作成しています。通常、サブクラスの1つまたは複数のメソッドをオーバーライドします。 を作成すると、そのような作成にはあまり意味がありません。 John Skeetが指摘しているように、ジェネリック型の匿名サブクラスを作成する理由は1つあります。his answerを参照してください。

EclipseがSerializable仕様(ArrayListはとてもそのすべてのサブクラスがあまりにもあり、Serializableである)に準拠するためには、あなたは、逆シリアル化プロセスが、そのクラス定義を保証することができ、そこからサブクラスでユニークserialVersionUIDを定義する必要があり、と警告それが連載されてから大幅に変更されていない(大幅==あなた自身は、新しい定義が古いものと互換性がないことを決定しましたので、あなたは、serialVersionUIDを変更することで、事実を表現することができます)。リストをシリアライズしない場合、警告は重要ではありません。

+2

匿名サブクラス。なぜ私は盲目だったのですか? –

7

Joonas氏によると、2番目の例では、匿名の内部クラスを作成しています。しかし、はあなたがなど任意のメソッドをオーバーライドしていない場合でも、これを行うには理由が次のとおりです。それはあなたが実行時にArrayListの要素型を決定することができます - 匿名内部クラスのスーパークラスだけではなく、ArrayList<Clazz>であるため、 ArrayList

これは型リテラルは、Guiceの中でどのように動作するかです。それはちょっと醜いハックですが、それは仕事を完了します...

+0

実行時に要素タイプをどのように決定することができますか? –

+1

@LouisRhys:インスタンスで 'getClass()'を呼び出すと、匿名クラスが返されます。 'getGenericSuperclass()'を呼び出すと、 'Type'は適切な情報を持っています。 –

関連する問題