泛型可以在Eclipse中编译和运行,但不能在javac中编译

该代码可以在Eclipse(20090920-1017)中编译并正常运行


import java.util.*;

public class SortNull {

   static <T extends Comparable<? super T>>

   Comparator<T> nullComparableComparator() {

      return new Comparator<T>() {

         @Override public int compare(T el1, T el2) {

         return

            el1 == null ? -1 :

            el2 == null ? +1 :

            el1.compareTo(el2);

         }

      };

   }

   public static void main(String[] args) {

      List<Integer> numbers = new ArrayList<Integer>(

         Arrays.asList(3, 2, 1, null, null, 0)

      );

      Comparator<Integer> numbersComp = nullComparableComparator();

      Collections.sort(numbers, numbersComp);

      System.out.println(numbers);

      // "[null, null, 0, 1, 2, 3]"


      List<String> names = new ArrayList<String>(

         Arrays.asList("Bob", null, "Alice", "Carol")

      );

      Comparator<String> namesComp = nullComparableComparator();

      Collections.sort(names, namesComp);

      System.out.println(names);

      // "[null, Alice, Bob, Carol]"

   }

}

但是它不能在上编译javac 1.6.0_17。这是错误消息:


SortNull.java:17: incompatible types; no instance(s) of type variable(s) T exist

 so that java.util.Comparator<T> conforms

 to java.util.Comparator<java.lang.Integer>

found   : <T>java.util.Comparator<T>

required: java.util.Comparator<java.lang.Integer>

     Comparator<Integer> numbersComp = nullComparableComparator();


SortNull.java:25: incompatible types; no instance(s) of type variable(s) T exist

 so that java.util.Comparator<T> conforms

 to java.util.Comparator<java.lang.String>

found   : <T>java.util.Comparator<T>

required: java.util.Comparator<java.lang.String>

     Comparator<String> namesComp = nullComparableComparator();


2 errors

有人可以解释为什么差异吗?这是错误吗?如果是这样,谁有错误?


qq_笑_17
浏览 542回答 3
3回答

尚方宝剑之说

这是一个已确认的错误:错误ID 6468354。这是相关的摘录:此问题是由以下事实引起的:有时javac的JLS3 15.12.2.8实现忽略递归边界,有时却忽略(如本例所示)。当递归边界包含通配符时,在计算未推断类型变量时将包括此类边界。这样可以进行后续的子类型化test (Integer <: Comparable<? super T>,其中T要推断出类型变量)。将在6369605之后修复在WinXP上也以1.6.0_13出现在我身上。嗯,我只是坚持使用Eclipse :)

当年话下

您可以通过显式指定泛型类来解决此问题:Comparator<String> namesComp = Stack.<String>nullComparableComparator();

犯罪嫌疑人X

我遇到了类似的问题,并从jdk1.6.0_16升级到jdk1.6.0_23,它消失了,没有任何代码更改。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java