相关疑难解决方法(0)

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

注意:这是关于null的Comparable和Comparator合同的衍生产品

这段代码在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, …
Run Code Online (Sandbox Code Playgroud)

java generics compiler-errors

23
推荐指数
2
解决办法
9338
查看次数

编译器使用泛型方法的null参数表现不同

以下代码与Eclipse完美编译,但无法使用javac进行编译:

public class HowBizarre {
      public static <P extends Number, T extends P> void doIt(P value) {
      }

      public static void main(String[] args) {
            doIt(null);
      }
}
Run Code Online (Sandbox Code Playgroud)

我简化了代码,所以现在根本不使用T. 不过,我没有看到错误的原因.由于某种原因,javac决定T代表Object,然后抱怨Object不符合T的界限(这是真的):

HowBizarre.java:6:不兼容的类型; 推断类型参数java.lang.Number,java.lang.Object不符合类型变量的范围P(T)

发现:<P,T>无效

要求:无效

       doIt(null);
           ^
Run Code Online (Sandbox Code Playgroud)

请注意,如果我将null参数替换为非null值,则编译正常.

哪个编译器行为正确,为什么?这是其中之一的错误吗?

java eclipse generics null compilation

16
推荐指数
1
解决办法
3622
查看次数

标签 统计

generics ×2

java ×2

compilation ×1

compiler-errors ×1

eclipse ×1

null ×1