ジェネリックはEclipseではコンパイルされて実行されますが、javacではコンパイルされません。質問する

ジェネリックは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

なぜこの矛盾が起こるのか説明してくれる人はいますか? これはバグですか? もしそうなら、誰がバグを抱えているのでしょうか?

ベストアンサー1

これは確認済みのバグです:バグID 6468354関連する抜粋は次のとおりです。

この問題は、javacの実装がJLS3 15.12.2.8再帰境界を無視しますが、無視しないこともあります (この場合のように)。再帰境界にワイルドカードが含まれている場合、推論されていない型変数を計算するときにそのような境界が含まれます。これにより、後続のサブタイプ (が推論される型変数であるtest (Integer <: Comparable<? super T>場合T) が作成されます。

修正予定6369605

WinXP 1.6.0_13 でも同じことが起こりました。まあ、Eclipse を使い続けることにします :)

おすすめ記事