2014-01-23 25 views
0

我試圖更好地理解Java接口,並對一些非常基本的代碼有以下問題。在Java中使用增強for循環與接口?

下面創建兩個實現相同接口的類。然後我創建兩個ArrayLists來保存這兩個類的對象。然後我想要創建一個單一的enhanced-for循環,它遍歷每個列表並執行最初在界面中定義的方法。

我以爲我可以使用一個循環,而不是接受一個特定的類類型,因爲它的參數可以使用接口類型來代替,這將允許我使用任何實現該接口的類,但似乎我有犯了錯誤。

我該如何去創建一個for循環,它只允許實現一個接口操作的類?

interface Valueing{ 
    double getValue(); 
} 

class Coin implements Valueing 
{ 
    private double coinVal = 0.0; 
    Coin(double initVal){ 
     coinVal = initVal; 
    } 
    public double getValue(){ 
     return this.coinVal; 
    } 
} 

class Note implements Valueing 
{ 
    private int noteVal = 0; 
    Note(int initVal){ 
     noteVal = initVal; 
    } 
    public double getValue(){ 
     return (double)noteVal; 
    } 
} 

public class IFaceBasics{ 
    public static void main(String[] args){ 
     ArrayList<Coin> myChange = new ArrayList<Coin>(); 
     myChange.add(new Coin(0.01)); 
     double totalChange = sumValues(myChange); 

     ArrayList<Note> myNotes = new ArrayList<Note>(); 
     myNotes.add(new Note(5)); 
     double totalNotes = sumValues(myNotes); 
    } 

    public double sumValues(ArrayList<Valueing> a){ 
     double totalSum = 0; 
     for(Valueing avg : a) 
     { 
      totalSum += avg.getAverage(); 
     } 
     return totalSum; 
    } 
} 

感謝您的任何反饋。

+0

使用可以使用泛型http://stackoverflow.com/questions/16707340/when-to-use-wildcards-in-java-generics –

+0

你爲什麼要嘗試在'Valueing'上調用'getAverage()'?這個接口沒有這樣的方法。 –

+0

編譯並運行代碼並描述它的錯誤。 –

回答

5

你幾乎得到它的權利,你只需要改變

public double sumValues(ArrayList<Valueing> a){ 

public double sumValues(ArrayList<? extends Valueing> a){ 

<? extends Valueing>意味着「Valueing或任何其子類型的」,因此這將讓該方法接受ArrayList<Coin>ArrayList<Note>以及ArrayList<Valueing>

+1

而不是編程到具體的類,你應該使用接口。所以'List'而不是'ArrayList',但這更多的是設計的東西,它應該工作,無論如何。 –

+0

+1的明確解釋 –

+0

謝謝,正在學習泛型,然後在閱讀http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html之前跳過了很遠。 –