2014-01-23 2 views
0

Я стараюсь лучше понимать интерфейсы Java и иметь следующую проблему с некоторым очень простым кодом.Использование расширенного для цикла с интерфейсами в Java?

Следующее создает два класса, которые реализуют один и тот же интерфейс. Затем я создаю два массива ArrayLists для хранения объектов этих двух классов. Затем я хочу создать один цикл расширенного цикла, который проходит через каждый список и выполняет метод, первоначально определенный в интерфейсе.

Я думал, что могу использовать цикл, который вместо того, чтобы брать определенный тип класса, поскольку его параметр мог бы использовать тип интерфейса вместо этого, это позволило бы мне использовать любой класс, который реализует этот интерфейс, но, похоже, у меня есть сборный ошибка.

Как я могу создать цикл 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

Использование может использоваться generics http://stackoverflow.com/questions/16707340/when-to-use-wildcards-in-java-generics –

+0

Почему вы пытаетесь вызвать 'getAverage()' на 'Valueing'? Этот интерфейс не имеет такого метода. –

+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

Спасибо, изучал Generics, а затем пропустил далеко вперед, прежде чем я прочитал http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html. –

Смежные вопросы