Привести список конкретного типа к списку его интерфейсов в Java - PullRequest
7 голосов
/ 19 августа 2011

Есть ли способ привести список конкретных типов к списку его интерфейсов в Java?

Например:

public class Square implements Shape { ... }

public SquareRepository implements Repository {

  private List<Square> squares;

  @Override
  public List<Shape> getShapes() {
    return squares; // how can I return this list of shapes properly cast?
  }

}

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

Caps

Ответы [ 3 ]

11 голосов
/ 19 августа 2011

Вы можете использовать общие символы , чтобы разрешить использование производных списков в качестве базовых списков:

public List<? extends Shape> getShapes() { ... }

Обратите внимание, что возвращенный список не может иметьк нему добавлены нулевые элементы .(Как указывает г-н Зауэр, вы можете добавить null, и удаление также подойдет.) Это компромисс, хотя, надеюсь, это не будет иметь значения в вашем случае.

, поскольку getShapes()переопределение, вам также необходимо обновить тип возвращаемого значения в Repository.

5 голосов
/ 18 ноября 2014

Если вы действительно хотите сделать это, может сработать что-то вроде ниже

@Override
public List<Shape> getShapes() {
   return new ArrayList<Shape>(squares); 
}
3 голосов
/ 19 августа 2011

Если вы контролируете интерфейс Repository, я предлагаю вам изменить его, чтобы он возвращал что-то типа List<? extends Shape>.

Это прекрасно компилируется:

interface Shape { }

class Square implements Shape { }

interface Repository {
    List<? extends Shape> getShapes();
}

class SquareRepository implements Repository {
    private List<Square> squares;

    @Override
    public List<? extends Shape> getShapes() {
        return squares;
    }
}
...