我对这个例子有点困惑。名称是字符串列表,但我们不使用通用e.x List<String>
,因此它假设一个对象列表。当我们在没有泛型类型的情况下调用Collections.sort时,它再次假定它是一个对象。如果我们看到sort方法Comparator意味着Comparator,但字符串不是这种情况。字符串不能超对象?有人可以解释它是如何工作的吗?
List names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
System.out.println(a);
return a.compareTo(b);
}
});
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
答案 0 :(得分:1)
类型擦除执行3 things:
- 如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或对象。
- 如有必要,插入类型转换以保护类型安全。
- 生成bridge methods以保留扩展泛型类型中的多态性。
醇>
你的问题是关于3号。
new Comparator<String>() {
@Override
public int compare(String a, String b) {
System.out.println(a);
return a.compareTo(b);
}
}
创建一个匿名内部类,它具有一个桥接方法public int compare(Object a, Object b)
,它将参数转换为String
并调用另一个方法。
以下是javap
输出,您可以在其中看到生成的桥接方法:
class Check$1 implements java.util.Comparator<java.lang.String> {
Check$1();
public int compare(java.lang.String, java.lang.String);
public int compare(java.lang.Object, java.lang.Object);
Code:
0: aload_0
1: aload_1
2: checkcast #31 // class java/lang/String
5: aload_2
6: checkcast #31 // class java/lang/String
9: invokevirtual #40 // Method compare:(Ljava/lang/String;Ljava/lang/String;)I
12: ireturn
}