我希望我的程序比较两个对象,但我不断收到错误消息,“找不到符号方法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;
}
}
}
答案 0 :(得分:0)
这可能是因为您在接口持有者中持有该实例,并且接口没有任何关于它的信息。
答案 1 :(得分:0)
这里发生的事情是
无论何时执行products.get(anything)
,它都会返回一个Product类对象(尽管它可能是一个Tool对象),当你在此调用compareTo方法时。
编译器在Product类中查找compareTo
方法,而不在Tool类中查找。
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
方法,并让子类实现它。