问题 1
使用
List<Integer> ints=new ArrayList<>();
代替
List<Integer> ints=new ArrayList<Integer>();
不会增加任何灵活性,因为它们完全相同。菱形 ( <>
) 表示我们不需要原始类型,而是明显的参数化类型。
甲骨文在这里描述它:
在 Java SE 7 中,您可以用一组空的类型参数 (<>) 替换构造函数的参数化类型:
它只是使代码不那么冗长,因此更易于阅读和维护。这在 Oracle 的示例中可能更为明显:
Map<String, List<String>> myMap = new HashMap<>();
相比
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
问题2
Arrays.asList(1,2);
从实现 List 接口的具体类返回一个对象。
在 Java 1.6 中,它是一个固定大小的实例java.util.Arrays.ArrayList
:
3354 public static <T> List<T> asList(T... a) {
3355 return new ArrayList<T>(a);
3356 }
但重要的一点是,对象总是属于实现其接口定义的方法的具体类。
当你这样做的时候Collections.sort(
,你不是在使用Collection
接口,而是使用包含这个非常具体的代码的Collections类:
132 public static <T extends Comparable<? super T>> void sort(List<T> list) {
133 Object[] a = list.toArray();
134 Arrays.sort(a);
135 ListIterator<T> i = list.listIterator();
136 for (int j=0; j<a.length; j++) {
137 i.next();
138 i.set((T)a[j]);
139 }
140 }