我一直在找不到符号方法compareTo ERROR

时间:2015-04-03 03:56:21

标签: java object interface comparable compareto

我希望我的程序比较两个对象,但我不断收到错误消息,“找不到符号方法compareTo(Product)”。但是我已经检查过了,我确实在Tool类中定义了compareTo方法,如下所示。

public class InventoryDemo
{
   public static List<Product> products = new ArrayList<Product>();
   public static void main(String [] args)
   {

    products.add(new Car("Jaguar", 1000000.00));
    products.add(new Car("Neon", 17000.00));
    products.add(new Tool("JigSaw", 149.18));
    products.add(new Car("Jaguar", 110000.00));
    products.add(new Car("Neon", 17500.00));
    products.add(new Car("Neon", 17875.32));
    products.add(new Truck("RAM",  35700.00));
    products.add(new Tool("CircularSaw", 200.00));
    products.add(new Tool("CircularSaw", 150.00));


    InventoryDemo.takeInventory("CircularSaw");
    if(products.get(7).compareTo(products.get(8)) == 0)
    {
        System.out.println("The price of Saw1 and the price of Saw2 are the same.");

    }
    else if(products.get(7).compareTo(products.get(8)) == 1)
    {
       System.out.println("Saw1 is more expensive tham Saw2.");
    }
    else
    {
        System.out.println("Saw2 is more expensive tham Saw1.");
    }


}

public class Tool implements Product, Comparable<Tool>
{

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(Tool t)
{
    if(cost > t.cost)
    {
        return 1;
    }
    else if(cost == t.cost)
    {
        return 0;
    }
    else 
    {
        return -1;
    }
}
}

5 个答案:

答案 0 :(得分:0)

这可能是因为您在接口持有者中持有该实例,并且接口没有任何关于它的信息。

答案 1 :(得分:0)

这里发生的事情是 无论何时执行products.get(anything),它都会返回一个Product类对象(尽管它可能是一个Tool对象),当你在此调用compareTo方法时。

编译器在Product类中查找compareTo方法,而不在Tool类中查找。

发生这种情况是因为在java中你只能调用在同一个类或超类中定义的方法。 例子看看这个

Class A{
    public void read(){
        ...
    }
}
Class B extends A{
    public void write(){
        ...
    }
}
Class Demo{
    public static void main(String args[]){
        A aObj=new B(); //works fine
        aObj.write(); //this is compilation error becaue compiler cannot find write method in Class A definition
    }
}

因此,要使您的程序正常工作,您需要在Product

中实现Comparable接口

希望这有帮助!

祝你好运!

答案 2 :(得分:0)

您在课程compareTo(Tool t)中实施了Tool方法。在InventoryDemo中,compareTo()由类型Product调用。您是否在Product界面中实现了compareTo()?

答案 3 :(得分:0)

您的Tool的compareTo方法可以比较2个工具。但是,您的ArrayList包含Product类型的元素,这是一个具有多个实现的接口。例如,您没有将工具与汽车进行比较的逻辑。

您可以将Product界面更改为Comparable<Product>。然后,所有实现它的类将被强制实施compareTo(Product),您将能够在compareTo列表的任意两个元素上调用products

答案 4 :(得分:0)

当你说

products.get(7).compareTo(products.get(8))与(实际编译器生成等效字节码)相同。

Product product = (Product)products.get(7); // This how Generics work at run time.
product.compareTo(products.get(8)) //Error Product class doesn't have `compareTo`

要解决此问题,请向compareTo类添加Product方法,并让子类实现它。