在Java中使用带有接口的增强型for循环?

Pik*_*Man 0 java foreach interface

我试图更好地理解Java接口,并在一些非常基本的代码中遇到以下问题.

以下创建两个实现相同接口的类.然后我创建两个ArrayLists来保存这两个类的对象.然后,我想创建一个增强型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;
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢您的任何反馈.

Ian*_*rts 5

你几乎做对了,你只需要改变

public double sumValues(ArrayList<Valueing> a){
Run Code Online (Sandbox Code Playgroud)

public double sumValues(ArrayList<? extends Valueing> a){
Run Code Online (Sandbox Code Playgroud)

<? extends Valueing>表示" Valueing或其任何子类型",因此这将使该方法接受ArrayList<Coin>ArrayList<Note>同样ArrayList<Valueing>.