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