Java 实现接口

Java 实现接口,java,interface,Java,Interface,大家好,我有一个任务,我需要实现一个接口来检查一个ArrayList并对它进行排序(升序或降序)。我不想要“答案”,我只需要一些关于我的方法和为什么会出现这个错误的建议 Exception in thread "main" java.lang.ClassCastException: Week7.Check cannot be cast to java.lang.Comparable at java.util.Arrays.mergeSort(Unknown Source) at java.u

大家好,我有一个任务,我需要实现一个接口来检查一个ArrayList并对它进行排序(升序或降序)。我不想要“答案”,我只需要一些关于我的方法和为什么会出现这个错误的建议

Exception in thread "main" java.lang.ClassCastException: Week7.Check cannot be cast to java.lang.Comparable
 at java.util.Arrays.mergeSort(Unknown Source)
 at java.util.Arrays.sort(Unknown Source)
 at java.util.Collections.sort(Unknown Source)
 at Week7.TestCheck.main(TestCheck.java:18)
我就是这样做的:

comparable有一种方法,叫做
public int compairTo(Object o)

公共类检查实现可比性{
私有整数校验号;
公共支票(整数newCheckNumber){
setCheckNumber(新CheckNumber);
}
公共字符串toString(){
返回getCheckNumber().toString();
}
public void setCheckNumber(整数checkNumber){
this.checkNumber=checkNumber;
}
公共整数getCheckNumber(){
返回支票号码;
}
@凌驾
公共int compairTo(对象o){
检查compair=(检查)o;
int结果=0;
if(this.getCheckNumber()>compair.getCheckNumber())
结果=1;
else if(this.getCheckNumber()
主要是我有这个

import java.util.ArrayList;
import java.util.Collections;

public class TestCheck {
    public static void main(String[] args) {
        ArrayList checkList = new ArrayList();

        checkList.add(new Check(445));
        checkList.add(new Check(101));
        checkList.add(new Check(110));
        checkList.add(new Check(553));
        checkList.add(new Check(123));

        Collections.sort(checkList);

        for (int i = 0; i < checkList.size(); i++) {
            System.out.println(checkList.get(i));
        }
    }
}
import java.util.ArrayList;
导入java.util.Collections;
公共类测试检查{
公共静态void main(字符串[]args){
ArrayList检查表=新建ArrayList();
检查表。增加(新检查表(445));
检查表。增加(新检查(101));
检查表。增加(新检查(110));
检查表。添加(新检查(553));
检查表。添加(新检查(123));
收集.分类(核对表);
对于(int i=0;i
实现接口时,必须使用接口提供的方法签名,与接口中定义的方法签名完全相同:

public int compareTo(Object o) 

此外,您可能希望将列表参数化,例如
列表
,可比较的例如
可比较的
,因为使用泛型是一种编译时技术,它可以识别您的拼写错误

当您实现一个接口时,您必须使用接口提供的方法签名,与界面中定义的完全相同:

public int compareTo(Object o) 

此外,您可能希望参数化列表,例如
List
,使用泛型时可比较的例如
Comparable
,这是一种编译时技术,可以识别拼写错误,Java区分大小写。“可比”与“可比”不同

拼写也很重要。“compairTo”与“compareTo”的方法不同


C'mon-Java区分大小写。“可比”与“可比”不同

拼写也很重要。“compairTo”与“compareTo”的方法不同


传递给
Arrays.sort()
的任何内容都必须实现
Comparable
,这是一个java系统接口。您可能想扔掉传递给
数组的任何内容。sort()
必须实现
comparable
,这是一个java系统接口。您可能想扔掉
可比的

[…以及]我为什么会犯这个错误

Exception in thread "main" java.lang.ClassCastException: Week7.Check cannot be cast to java.lang.Comparable
 at java.util.Arrays.mergeSort(Unknown Source)
 at java.util.Arrays.sort(Unknown Source)
 at java.util.Collections.sort(Unknown Source)
 at Week7.TestCheck.main(TestCheck.java:18)
当你打电话时:

Collections.sort(checkList);
在第18行中,该方法期望您的元素实现
Comparable
(能够比较它们)。您可能不知道这一点,但它就是这样工作的(如中所述)

列表中的所有元素必须实现可比较的接口

然后该方法运行,它尝试将对象“强制转换”为类型
Comparable
,因为您的类没有实现它,所以它会抛出
ClassCastException

为了更好地理解这一点,请尝试以下代码:

class Some {
}
class Test {
    public static void main( String [] args ) {
         Runnable r = ( Runnable ) new Some();
    }
}
如果你分析这行代码,你可能会想“为什么你要从一些代码中分配一个Runnable?它们之间没有关联!”

您是对的,让我们看看输出:

$ java Test
Exception in thread "main" java.lang.ClassCastException: Some cannot be cast to java.lang.Runnable
        at Test.main(A.java:5)
相同的错误消息。你可以看看第5行,看看演员阵容

这正是在
Collections.sort
方法中发生的情况,但是使用
Comparable

[…以及]我为什么会犯这个错误

Exception in thread "main" java.lang.ClassCastException: Week7.Check cannot be cast to java.lang.Comparable
 at java.util.Arrays.mergeSort(Unknown Source)
 at java.util.Arrays.sort(Unknown Source)
 at java.util.Collections.sort(Unknown Source)
 at Week7.TestCheck.main(TestCheck.java:18)
当你打电话时:

Collections.sort(checkList);
在第18行中,该方法期望您的元素实现
Comparable
(能够比较它们)。您可能不知道这一点,但它就是这样工作的(如中所述)

列表中的所有元素必须实现可比较的接口

然后该方法运行,它尝试将对象“强制转换”为类型
Comparable
,因为您的类没有实现它,所以它会抛出
ClassCastException

为了更好地理解这一点,请尝试以下代码:

class Some {
}
class Test {
    public static void main( String [] args ) {
         Runnable r = ( Runnable ) new Some();
    }
}
如果你分析这行代码,你可能会想“为什么你要从一些代码中分配一个Runnable?它们之间没有关联!”

您是对的,让我们看看输出:

$ java Test
Exception in thread "main" java.lang.ClassCastException: Some cannot be cast to java.lang.Runnable
        at Test.main(A.java:5)
相同的错误消息。你可以看看第5行,看看演员阵容


这正是在
Collections.sort
方法中发生的事情,但是使用
Comparable
我猜您实现的接口Comparable不是接口java.lang.Comparable,它们的名称可能相同,但是包?

我猜您实现的接口comparable不是接口java.lang.comparable,它们的名称可能相同,但是包?

使用
Comparator
(您用两个参数调用的)您必须将其作为参数传递给
Collections.sort
方法

像这样:

Collections.sort( checkList, new Comparator<Check>() {
    public int compare( Check one, Check two ) {
        return one.getCheckNumber() - two.getCheckNumber();
    }
 });
Collections.sort(检查表,新比较器(){
公共整数比较(勾选一,勾选二){
返回1.getCheckNumber()-2.getCheckNumber();
}
});
这就是它的样子:

import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;

public class Check   {
    private final Integer checkNumber;

    public Check(Integer newCheckNumber) {
        this.checkNumber = newCheckNumber;
    }
    public Integer getCheckNumber() {
        return this.checkNumber;
    }
    public static void main( String [] args ) {
        List<Check> list = new ArrayList<Check>();

        list.add(new Check(445));
        list.add(new Check(101));
        list.add(new Check(110));
        list.add(new Check(553));
        list.add(new Check(123));

        Collections.sort( list, new Comparator<Check>() {
           public int compare( Check one, Check two ){
               return one.getCheckNumber() - two.getCheckNumber();
           } 
        });
        for( Check item : list ) {
            System.out.println( item.getCheckNumber() );
        }
    }
}
import java.util.List;
导入java.util.ArrayList;
导入java.util.Comparator;
导入java.util.Collections;
公共类检查{
私有最终整数校验号;
公共支票(整数newCheckNumber){
这