Java中的"new Foo(){}"与"new Foo()"

mar*_*one 14 java arraylist

例如:

Object o1 = new ArrayList<String>();
Object o2 = new ArrayList<String>(){};
Object o3 = new ArrayList<String>(){{}};
Run Code Online (Sandbox Code Playgroud)

有什么不同?

我不能谷歌java的第2 /第3语法,任何参考?

Pet*_*rey 25

第一个创建一个ArrayList

第二个创建ArrayList的匿名子类,它具有特定的泛型类型的String

第三个是相同的,但它有一个空的初始化块.

注意:如果可能的话,您应该编写最简单,最清晰的代码,尤其是在考虑性能的情况下.

  • 我认为你应该加上"除非有详细的评论说明匿名类有一些奇怪的特殊需要来规避反思,第二和第三个案例只是简单的愚蠢,混乱和错误." (4认同)

nac*_*okk 13

Object o1 = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

创建一个ArrayList.

Object o2 = new ArrayList<String>(){};
Run Code Online (Sandbox Code Playgroud)

在这里,您将创建一个扩展的匿名类,ArrayList<String>不会覆盖任何内容.所以区别在于你是在没有覆盖行为的情况下继承ArrayList,如果你没有充分的理由,就不要这样做.

Object o3 = new ArrayList<String>(){{}};
Run Code Online (Sandbox Code Playgroud)

你创建的是2,但是有一个空的initalizer块.

  • @marstone.不,这不是用途.无法避免类型擦除. (2认同)