Как я могу привести список, используя дженерики в Java? - PullRequest
26 голосов
/ 19 марта 2009

Обратите внимание на следующий фрагмент:

public interface MyInterface {

    public int getId();
}

public class MyPojo implements MyInterface {

    private int id;

    public MyPojo(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

}

public ArrayList<MyInterface> getMyInterfaces() {

    ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return (ArrayList<MyInterface>) myPojos;
}

Оператор return выполняет приведение, которое не компилируется. Как я могу преобразовать список myPojos в более общий список , не просматривая каждый элемент списка ?

Спасибо

Ответы [ 5 ]

41 голосов
/ 19 марта 2009

Измените свой метод, чтобы использовать подстановочный знак:

public ArrayList<? extends MyInterface> getMyInterfaces() {    
    ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return myPojos;
}

Это предотвратит попытку вызывающего абонента добавить другие реализации интерфейса в список. В качестве альтернативы вы можете просто написать:

public ArrayList<MyInterface> getMyInterfaces() {
    // Note the change here
    ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return myPojos;
}

Как обсуждено в комментариях:

  • Возвращение коллекций с подстановочными знаками может быть неудобно для звонящих
  • Обычно лучше использовать интерфейсы вместо конкретных типов для возвращаемых типов. Таким образом, предлагаемая подпись, вероятно, будет одной из:

    public List<MyInterface> getMyInterfaces()
    public Collection<MyInterface> getMyInterfaces()
    public Iterable<MyInterface> getMyInterfaces()
    
24 голосов
/ 19 марта 2009

Лучше всего выбрать правильный тип с самого начала, однако, чтобы ответить на ваш вопрос, вы можете использовать стирание типа.

return (ArrayList<MyInterface>) (ArrayList) myPojos;

4 голосов
/ 19 марта 2009

Вы должны делать:

public ArrayList<MyInterface> getMyInterfaces() {   
   ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0);    
   myPojos.add(new MyPojo(0));    
   myPojos.add(new MyPojo(1));    
   return myPojos;
}
0 голосов
/ 19 марта 2009

Попробуйте использовать интерфейсы везде, кроме как при создании экземпляров, и ваши проблемы исчезнут:

public List<MyInterface> getMyInterfaces()
{
    List<MyInterface> myInterfaces = new ArrayList<MyInterface>(0);
    myInterfaces.add(new MyPojo(0));
    myInterfaces.add(new MyPojo(1));

    return myInterfaces;
}

Как уже говорили другие, использование MyInterface решает вашу проблему. Также лучше использовать интерфейс List вместо ArrayList для возвращаемых типов и переменных.

0 голосов
/ 19 марта 2009

В этом случае я бы сделал это так:

public ArrayList<MyInterface> getMyInterfaces() {

    ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return myPojos;
}

MyPojo ist типа MyInterface (так как он реализует интерфейс). Это означает, что вы можете просто создать список с нужным вам интерфейсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...