2015-04-03 57 views
1

我想讓我的程序比較兩個對象,但我總是收到一條錯誤消息,「找不到符號方法compareTo(Product)」。但是我已經檢查過了,我在Tool類中定義了compareTo方法,如下所示。我一直在收不到符號方法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

你的產品在哪裏? – Pratik 2015-04-03 04:02:35

+0

您需要檢查compareTo方法this.cost> t.cost – Pratik 2015-04-03 04:03:14

回答

0

這可能是因爲你在接口持有者中持有實例,並且接口沒有任何關於它的信息。

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 
    } 
} 

所以對於你的程序正常工作需要實現可比接口產品

希望這有助於!

祝你好運!

0

您在類Tool中實施了compareTo(Tool t)方法。在InventoryDemo中,compareTo()由類型Product調用。你有在Product接口實現的compareTo()嗎?

0

您的Tool的compareTo方法可以比較2個工具。但是,ArrayList包含Product類型的元素,這是一個具有多個實現的接口。例如,您沒有將工具與汽車進行比較的邏輯。

您可以將您的Product界面更改爲Comparable<Product>。然後,所有實施它的課程將被強制執行compareTo(Product),並且您可以在products列表的任何兩個元素上撥打compareTo

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類,讓子類實現它。

相關問題