これらの2つの違いは何ですか?なぜ後者は新しいシリアライズ可能なクラスを作成するのですか?ArrayList <>()とArrayList <>(){}の相違点
new ArrayList<Clazz>()
はEclipseの新しい空のArrayList
を作成示しています。最初の例でThe serializable class does not declare a static final serialVersionUID field of type long
これらの2つの違いは何ですか?なぜ後者は新しいシリアライズ可能なクラスを作成するのですか?ArrayList <>()とArrayList <>(){}の相違点
new ArrayList<Clazz>()
はEclipseの新しい空のArrayList
を作成示しています。最初の例でThe serializable class does not declare a static final serialVersionUID field of type long
を、あなたはArrayList
インスタンスを作成しています。後者では、ArrayList
の匿名サブクラスのインスタンスを作成しています。通常、サブクラスの1つまたは複数のメソッドをオーバーライドします。
を作成すると、そのような作成にはあまり意味がありません。
John Skeetが指摘しているように、ジェネリック型の匿名サブクラスを作成する理由は1つあります。his answerを参照してください。
EclipseがSerializable
仕様(ArrayList
はとてもそのすべてのサブクラスがあまりにもあり、Serializable
である)に準拠するためには、あなたは、逆シリアル化プロセスが、そのクラス定義を保証することができ、そこからサブクラスでユニークserialVersionUID
を定義する必要があり、と警告それが連載されてから大幅に変更されていない(大幅==あなた自身は、新しい定義が古いものと互換性がないことを決定しましたので、あなたは、serialVersionUID
を変更することで、事実を表現することができます)。リストをシリアライズしない場合、警告は重要ではありません。
Joonas氏によると、2番目の例では、匿名の内部クラスを作成しています。しかし、はあなたがなど任意のメソッドをオーバーライドしていない場合でも、これを行うには理由が次のとおりです。それはあなたが実行時にArrayList
の要素型を決定することができます - 匿名内部クラスのスーパークラスだけではなく、ArrayList<Clazz>
であるため、 ArrayList
。
これは型リテラルは、Guiceの中でどのように動作するかです。それはちょっと醜いハックですが、それは仕事を完了します...
実行時に要素タイプをどのように決定することができますか? –
@LouisRhys:インスタンスで 'getClass()'を呼び出すと、匿名クラスが返されます。 'getGenericSuperclass()'を呼び出すと、 'Type'は適切な情報を持っています。 –
匿名サブクラス。なぜ私は盲目だったのですか? –