实现java Comparable <t>类</t>的问题

时间:2014-05-16 14:30:01

标签: java class interface abstract-class comparable

下图显示了在尝试实施位于if-else类中的compareTo()方法时涉及Tool条件的编译错误。我不确定这个问题,因为看起来该方法是public并且在我的Tool类中(从中构造了两个被比较的对象)。

Graphic showing compilation error.

public interface Product {
    public abstract String getName();
    public abstract double getCost();
}

public abstract class Vehicle implements Product {
    private String name;
    private double cost;

    public Vehicle(String name, double cost) {
        this.name = name;
        this.cost = cost;
    }

    public String getName() {
        return name;
    }

    public double getCost() {
        return cost;
    }
}

public class Car extends Vehicle {
    public Car(String s, double d) {
        super(s, d);
    }
}

public class Truck extends Vehicle {
    public Truck(String s, double d) {
        super(s, d);
    }
}

public class Tool implements Product, Comparable<Product> {
    private String name;
    private double cost;

    public Tool(String name, double cost) {
        this.name = name;
        this.cost = cost;
    }

    public String getName() {
        return name;
    }

    public double getCost() {
        return cost;
    }

    public int compareTo(Product obj) {
        if (getCost() < obj.getCost()) {
            return -1;
        } else if (getCost() == obj.getCost()) {
            return 0;
        } else {
            return 1;
        }
    }
}

import java.util.*;
public class InventoryDemo
{
    public static void main(String [] args) {
        ArrayList<Product> list = new ArrayList<Product>();
        list.add(new Car("Jagur", 1000000));
        list.add(new Car("Neon", 17000));
        list.add(new Tool("JigSaw", 149.18));
        list.add(new Car("Jaguar", 110000));
        list.add(new Car("Neon", 17500));
        list.add(new Car("Neon", 17875.32));
        list.add(new Truck("RAM", 35700));
        list.add(new Tool("CircularSaw", 200));
        list.add(new Tool("CircularSaw", 150));
        list.add(new Tool("saw1", 200));
        list.add(new Tool("saw2", 150));

        if(list.get(9).compareTo(list.get(10)) == 0) {
            System.out.println("\nThey are the same size using compareTo().");
        } else {
            System.out.println("\nThey are not the same size using compareTo().");
        }
    }
}

4 个答案:

答案 0 :(得分:1)

问题是您的列表属于List<Product>类型,但产品未实现Comparable接口,因此此类型不实现该方法。

public interface Product extends Comparable<Product> {
    public abstract String getName();
    public abstract double getCost();
}

答案 1 :(得分:1)

您的Product界面不会延伸Comparable<Product>,而是添加

int compareTo(Product other);

list被声明为ArrayList<Product>,因此list.get(9)会返回Product个对象。

要解决问题,您必须使Product扩展Comparable<Product>并在Vehicle中实现方法,或者使用equals()方法,而不是覆盖默认实现。实际上第二种方式是可取的,因为equals()方法检查对象是否相等,而compareTo()告诉你此对象是否大于其他对象,或者其他更大比这更好,或者没有一个适用 - 这使equals()在你的情况下在语义上更正确。

答案 2 :(得分:1)

您的listArrayList<Product>,因此list.get(9)会返回Product

compareTo(Product)方法未在接口Product中定义。它是在课程Tool中定义的,但您尝试在Product上调用它,而Tool不是(总是)Product

要解决此问题:使界面Comparable<Product>扩展interface Product extends Comparable<Product> {

Product

当然,这意味着实现接口public int compareTo(Product obj)的任何(非抽象)类也必须具有{{1}}方法。

答案 3 :(得分:1)

您尝试调用compareTo()的列表项是Product,因为该列表被声明为Products列表:

ArrayList<Product> list = new ArrayList<Product>();

当访问列表中的项目时,Java只知道这些项目实现了Product接口,而不管实际的类是否也实现了Comparable。

一种解决方案是将Product定义为扩展Comparable:

public interface Product extends Comparable<Product> {
  public abstract String getName();
  public abstract double getCost();
}