让你自己的班级'可比'

时间:2012-10-24 14:42:00

标签: java comparable

我遵循了教程,但未能为我的Country制作ComparableBST

主:

BinarySearchTree A = new BinarySearchTree();
Country a = new Country("Romania", "Bucharest", 1112);
A.insert(a);

国家/地区类:

public int compareTo(Object anotherCountry) throws ClassCastException {
    if (!(anotherCountry instanceof Country))
        throw new ClassCastException("A Country object expected.");
    String anotherCountryName = ((Country) anotherCountry).getName();  
    int i = this.name.compareTo(anotherCountryName);
    if(i < 0){
        return -1;
    } else {
        return 0;
    }
}

错误:

@Override
public int compareTo(Object anotherCountry) throws ClassCastException {
    if (!(anotherCountry instanceof Country))
      throw new ClassCastException("A Country object expected.");
    String anotherCountryName = ((Country) anotherCountry).getName();  
    return this.name.compareTo(anotherCountryName);

Description Resource    Path    Location    Type

名称冲突:类型为Country的方法compareTo(Object)具有与Comparable类型的compareTo(T)相同的擦除但不覆盖它Country.java / Lab2_prob 4 / src第17行Java问题

Description Resource    Path    Location    Type
The method compareTo(Object) of type Country must override or implement a supertype method  Country.java    /Lab2_prob 4/src    line 17 Java Problem

和班级:

public class Country implements Comparable<Country>{
    private String name;
    private String capital;
    private int area;

Description Resource    Path    Location    Type

类型Country必须实现继承的抽象方法Comparable.compareTo(Country)Country.java / Lab2_prob 4 / src第2行Java问题

2 个答案:

答案 0 :(得分:19)

您的Country课程应该实施Comparable

public class Country implements Comparable<Country>

然后您的compareTo方法应如下所示:

@Override
public int compareTo(Country anotherCountry) {
    return anotherCountry.getName().compareTo(this.name);
}

请注意compareTo的签名。参数可以(且必须)属于Country而不是Object。这是因为Comparable上的泛型类型参数而实现的。好处是你不必再检查类型了。缺点是你只能将Country与其他Country个对象(或它的子类型)进行比较,但在大多数情况下,无论如何这都是你想要的。如果不是,则必须更改类型参数。例如。如果您使用Comparable<Object>,则compareTo的签名可以再次为Object。如果您愿意,可以阅读泛型here

答案 1 :(得分:5)

Comparable应该返回:

  

负整数,零或正整数,因为此对象较少   比,等于或大于指定的对象。

但是,您的代码只返回-1或0,这是不正确的;这意味着this可以小于另一个对象,或者相等,但不能更大!

无需修改name.compareTo()返回的值 - 您可以直接返回它们。