我正在尝试使用以下方式创建 List 实例:
List<String> listOne = new ArrayList<String>();
List<String> listTwo = new ArrayList<String>(){};
List<String> listThree = new ArrayList<String>() {{}};
只有listOne
被初始化为java.util.ArrayList
,listTwo
和listThree
没有。
初始化 listTwo 和 listThree 会发生什么,如何更好地理解它?
我的测试示例如下:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> listOne = new ArrayList<String>();
List<String> listTwo = new ArrayList<String>(){};
List<String> listThree = new ArrayList<String>() {{}};
System.out.printf("listOne.getClass() == listTwo.getClass() is %b \n",
listOne.getClass() == listTwo.getClass());
System.out.printf("listOne.getClass() == listThree.getClass() is %b \n",
listOne.getClass() == listThree.getClass());
System.out.printf("listThree.getClass() == listTwo.getClass() is %b \n",
listThree.getClass() == listTwo.getClass());
System.out.printf("listOne.getClass() is %s \n",listOne.getClass());
System.out.printf("listTwo.getClass() is %s \n",listTwo.getClass());
System.out.printf("listThree.getClass() is %s \n",listThree.getClass());
}
}
它在控制台的输出如下:
listOne.getClass() == listTwo.getClass() is false
listOne.getClass() == listThree.getClass() is false
listThree.getClass() == listTwo.getClass() is false
listOne.getClass() is class java.util.ArrayList
listTwo.getClass() is class Test$1
listThree.getClass() is class Test$2
最佳答案
在此创建 ArrayList 类的新实例
List<String> listOne = new ArrayList<String>();
在这里你定义了一个从 ArrayList 扩展的匿名类并创建它的新实例
List<String> listTwo = new ArrayList<String>(){};
这里你定义了另一个匿名类,它扩展自 ArrayList 并在初始化 block 中声明并创建它的一个实例
List<String> listThree = new ArrayList<String>() {{}};
关于java - 类似 ArrayList 声明之间的类型差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126047/