尝试使用compareTo()排序数组但得到错误

时间:2013-08-28 17:18:05

标签: java arrays

public class Dog {
 int size;
 String name;

 //Deploying a constructor
 Dog(String name, int size){
     this.name=name;
     this.size=size;
 }

 //Deploying toString() for printing
 public String toString(){
 return name+"/"+size;
 }

 //Deploying compareTo() method and overriding it for int value
 public int compareTo(Object s){
 return (this.size-((Dog)s).size);
 }
}
import java.util.Arrays;
public class CompareTo {
public static void main(String[] args){
     Dog[] obj=new Dog[5];
 obj[0]=new Dog("Alpha",332);
 obj[1]=new Dog("Romeo",32);
 obj[2]=new Dog("Charlie",332);
 obj[3]=new Dog("Tyson",632);
 obj[4]=new Dog("Roger",532);
//Without Sorting taking the output
 for(Object x:obj){
    System.out.println(x);
}
//With Sorting taking the output
     try{Arrays.sort(obj);
     for(Object x: obj){
        System.out.println(x);
     }
    }catch(Exception e){
    System.out.println("Something is wrong in this line"+e);
    }
   }
  }

Output-Alpha/332
Romeo/32
Charlie/332
Osama/632
Laden/532
Something is wrong in this linejava.lang.ClassCastException: Dog cannot be cast to java.lang.Comparable                                                                                                                  

您好, 我试图根据狗的大小来缩短Dog对象。我将最超类的对象x向下转换为Dog类,但不知道为什么在运行时java正在执行try和catch块,说Dog不能转换为java.lang.Comparable

5 个答案:

答案 0 :(得分:4)

您已指定compareTo方法,但未声明Dog类来实施Comparable<Dog>。此外,一旦您这样做,您需要将s的{​​{1}}参数声明为compareTo

答案 1 :(得分:2)

如果Arrays.sort(obj)不知道如何比较两个Dog以查看哪一个会先出现,那么您期望Dog如何工作? Comparable<Dog>应该实施{{1}}。

答案 2 :(得分:1)

您的Dog类必须实现到接口Comparable

答案 3 :(得分:1)

您必须使用implements关键字以及已实现界面的名称(在本例中为Comparable),您也可以抓住机会推断通用参数<Dog>

public class Dog implements Comparable<Dog>{
    int size;
    String name;
...

使用泛型,您的代码必须稍微更改一下:而不是Object,您需要Dog作为compareTo()的参数类型。

另外,您可以考虑在@Override上使用compareTo()注释来提高效果:

@Override
public int compareTo(Dog s){
...

(注意这里的狗类型参数!)

答案 4 :(得分:1)

您忘记在Dog类中实现Comparable接口。你的狗课应该如下。

  class Dog  implements Comparable<Dog> {

   int size;
   String name;

  // Deploying a constructor
  Dog(String name, int size) {
      this.name = name;
      this.size = size;
  }

  // Deploying toString() for printing
  public String toString() {
       return name + "/" + size;
  }

  // Deploying compareTo() method and overriding it for int value
  public int compareTo(Dog s) {
    return this.size - s.size;
  }
}