Список <MyObject>в список <MyInterface> - PullRequest
0 голосов
/ 27 сентября 2011

Я пишу кусок кода в Java и хотел бы инкапсулировать мой объект и только возвращать интерфейсы.

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

Без получения этого предупреждения об ошибке:

Список является необработанным типом.Ссылки на универсальный тип List должны быть параметризованы

. Чтобы дать вам ясную картину, этот фрагмент кода является примером моей проблемы:

public class Employee{

  private List<MyObject> myObjects;

  public List<MyInterface> getMyObjects(){
    return myObjects;
  }

}

, где MyObject реализует MyInterface и возврат myObjects приводит к проблеме..

Заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 27 сентября 2011

Если MyObject реализует MyInterface, вы можете изменить тип возврата на List<? extends MyInterface>.

class Employee{
  private List<MyObject> myObjects;

  public List<? extends MyInterface> getMyObjects(){
     return myObjects;
  }
}

Обратите внимание, что в этом случае компилятор не позволит вам вызвать add(...)возвращенный список, за исключением того, что вы бросили здесь.Однако, поскольку вы возвращаете только интерфейсы, я полагаю, что вы не планируете добавлять что-либо в возвращаемый список, так что с вами все будет в порядке.

1 голос
/ 27 сентября 2011

Даже если MyObject реализует MyInterface, не верно, что List<MyObject> расширяет List<MyInterface> - см. этот превосходный документ для получения дополнительной информации. Чтобы сообщить компилятору о ваших намерениях, укажите сигнатуру метода следующим образом:

public List<? extends MyInterface> getMyObjects{
    ...
1 голос
/ 27 сентября 2011

Я бы просто определил атрибут экземпляра так, как вам нужно:

public class Employee{

  private List<MyInterface> myObjects;

  public List<MyInterface> getMyObjects(){
    return myObjects;
  }

}
1 голос
/ 27 сентября 2011

Просто объявите список вашего интерфейса как переменную вашего экземпляра.

private List<MyInterface> myObjects;
0 голосов
/ 27 сентября 2011

Вы не можете разыграть List<MyObject> до List<MyInterface>. Поэтому попробуйте определить myObjects как List<MyInterface> или используйте следующее:

public class Employee{
  private List<MyObject> myObjects;

  public List<MyInterface> getMyObjects(){
    List<MyInterface> result = new ArrayList<MyInterface>(myObjects.size());
    result.addAll(result);
    return result;
  }
}
0 голосов
/ 27 сентября 2011

Использовать checkedCollection (Коллекция c, Тип класса)

http://download.oracle.com/javase/1,5.0/docs/api/java/util/Collections.html#checkedCollection(java.util.Collection, java.lang.Class)

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