下图显示了在尝试实施位于if-else
类中的compareTo()
方法时涉及Tool
条件的编译错误。我不确定这个问题,因为看起来该方法是public
并且在我的Tool
类中(从中构造了两个被比较的对象)。
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().");
}
}
}
答案 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)
您的list
是ArrayList<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();
}