扩展泛型类型的方法签名“不正确”

时间:2013-12-27 13:06:32

标签: java generics

我的java泛型出现编译时错误,我不明白。

我有两种方法:

public static final <T> T doStuff(List<T> list, int k, Comparator<T> comparator) {
  T element = null;
  //some stuff done
  return element;
}

public static final <T extends Comparable> T doStuff(List<T> list, int k) {
  Comparator<T> comparator = new Comparator<T>() {
    public int compare (T o1, T o2) {
      return o1.compareTo(o2);
    }
  };
  return doStuff(list, k, comparator);
}

如果找不到方法doStuff(java.util.List,int,java.util.Comparator),则会失败。 当我将第二种方法更改为:

public static final <T> T doStuff(List<T> list, int k) {
  Comparator<T> comparator = new Comparator<T>() {
    public int compare (T o1, T o2) {
      return ((Comparable)o1).compareTo(o2);
    }
  };
  return doStuff(list, k, comparator);
}

工作正常。

有人可以对此有所了解。

2 个答案:

答案 0 :(得分:2)

您的通用参数受原始类型Comparable的限制, 与其自身相比(即T)。

而是将类型从<T extends Comparable>更改为<T extends Comparable<T>>


以下代码编译:

public static final <T> T doStuff(List<T> list, int k,
        Comparator<T> comparator) {
    T element = null;
    // some stuff done
    return element;
}

public static final <T extends Comparable<T>> T doStuff(List<T> list, int k) {
    Comparator<T> comparator = new Comparator<T>() {
        public int compare(T o1, T o2) {
            return o1.compareTo(o2);
        }
    };
    return doStuff(list, k, comparator);
}

答案 1 :(得分:1)

可比较本身就是通用的。如果您改为

会发生什么
public static final <T extends Comparable<? super T>> T doStuff(List<T> list, int k) ...