1。首先:
之间有什么区别ArrayList<Class> myList = new ArrayList<Class>();
ArrayList<Class> myList = new ArrayList<>();
2。第二:
如果我像这样声明myList:
ArrayList myList = new ArrayList<Integer>();
为什么这仍然有效:myList.add("A String!!");
但不使用此声明:
ArrayList<Integer> myList = new ArrayList<>();
答案 0 :(得分:0)
关于您的第一个问题:
之间有什么区别
ArrayList<Class> myList = new ArrayList<Class>(); ArrayList<Class> myList = new ArrayList<>();
没有区别。在第二种情况下,让编译器通过type inference来决定类型。
关于第二个问题:
如果我像这样声明myList:
ArrayList myList = new ArrayList<Integer>();
为什么这仍然有效:
myList.add("A String!!");
但不使用此声明:
ArrayList<Integer> myList = new ArrayList<>();
You are using a raw type in the first case。这有点像使用Object
作为泛型类型,只是更糟糕。您放弃所有编译时类型检查,因此您的示例中将遇到Exception
。
答案 1 :(得分:0)
前两个没有区别。第二个是java 7中添加的第一个的简短版本(我认为)
在第二件事中,你声明了一个通用的java列表(声明并没有说它是整数列表)。然后你给该变量一个ArrayList的实例。这是你做的事情,并不在声明中。这就是代码编译的原因(你可以添加一个字符串,因为数组列表的实例可以是任何东西)。但它会在运行时失败,因为在当前运行中,实例是整数列表。
当你声明它是ArrayList myList时,它知道编译时该列表只能有整数并且编译失败。