java中的通用示例解释

时间:2017-11-29 05:54:37

标签: java generics

我对这个例子有点困惑。名称是字符串列表,但我们不使用通用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);
  }

1 个答案:

答案 0 :(得分:1)

类型擦除执行3 things

  
      
  1. 如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或对象。
  2.   
  3. 如有必要,插入类型转换以保护类型安全。
  4.   
  5. 生成bridge methods以保留扩展泛型类型中的多态性。
  6.   

你的问题是关于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

}