错误:绑定不匹配,Collections.sort,interface,compareTo方法

时间:2014-04-07 11:09:34

标签: java arraylist interface

我想比较一个名为CalendarDate的新类。我创建了一个可比较的接口,并使公共类CalendarDate实现Comparable。我还在类中编写了compareTo(CalendarDate Other)方法。

然而,当我尝试 Collections.sort (生日)时,它表示绑定不匹配。 (它有详细信息:绑定不匹配:类型集合的泛型方法排序(List)不适用于参数(ArrayList)。推断类型CalendarDate不是有界参数的有效替代品>)

我的代码出了什么问题?感谢。

P.S。 CalendarDateTest.java中的 sort 一词下面有一条RED行。

Comparable.java

package Chapter10;

public interface Comparable<T> {
    public int compareTo(T other);
}

CalendarDate.java

package Chapter10;

public class CalendarDate implements Comparable<CalendarDate> {
    private int month;
    private int day;

    public CalendarDate(int month, int day) {
        this.month = month;
        this.day = day;
    }

    public int compareTo(CalendarDate other) {
        if (month != other.month) {
            return month - other.month;
        }
        else {
            return day - other.day;
        }
    }

    public String toString() {
        return month + "/" + day;
    }
}

CalendarDateTest.java

package Chapter10;

import java.util.*;

public class CalendarDateTest {
    public static void main (String[] args) {
        ArrayList<CalendarDate> birthday = new ArrayList<CalendarDate>();
        birthday.add(new CalendarDate(1, 23));
        birthday.add(new CalendarDate(5, 18));
        birthday.add(new CalendarDate(12, 17));
        birthday.add(new CalendarDate(2, 29));
        birthday.add(new CalendarDate(8, 6));

        System.out.println("birthdays = " + birthday);
        Collections.sort(birthday);
        System.out.println("birthdays = " + birthday);
    }
}

2 个答案:

答案 0 :(得分:0)

问题是你已经重新定义了Java已定义的Comparable<T>接口。就Java而言,尽管具有相同的名称,但它们是两个完全不同的,不相关的接口。 Collections.sort方法了解java.lang.Comparable<T>,但不知道您的Chapter10.Comparable<T>

从项目中删除Comparable.java文件,重新编译并运行;这应该解决问题。

Running demo on ideone.

答案 1 :(得分:0)

您必须使用java.lang.Comparable<T>界面而不是您自己的实现。

如果您仍然希望使用自己的扩展功能接口,则接口必须扩展java.lang.Comparable<T>接口。但请注意,对于使用Collections.sort()方法,这没有任何区别。

提示:为了确保覆盖现有方法,您应该向@OverridecompareTo()添加toString()注释。