Вопрос интерфейса Java - PullRequest
       24

Вопрос интерфейса Java

4 голосов
/ 22 декабря 2010

Допустим, у меня есть 2 интерфейса, A и B:

public interface A {
 List<B> getBs();
}

public interface B {
}

и 2 класса, которые реализуют эти интерфейсы:

public class AImpl implements A {

 public List<B> getBs() {
  return null;
 }

}


public class BImpl implements B {
}

Возможно ли (возможно, с использованием обобщений), что мой метод getter возвращает список объектов, типизированных BImpl, что-то вроде:

public class AImpl implements A {

 public List<BImpl> getBs() {
  return null;
 }

}

Спасибо

Ответы [ 3 ]

6 голосов
/ 22 декабря 2010

Я думаю, вам нужно изменить объявление интерфейса следующим образом:

public interface A {
 List<? extends B> getBs();
}

Однако, если вы хотите, чтобы клиенты знали, какой тип реализации вы используете, все будет сложнее:

public interface A<C extends B> {
     List<C> getBs();
}

public class AImpl implements A<Bimpl>{
     public List<Bimpl> getBs();
}
3 голосов
/ 22 декабря 2010

Нет, потому что универсальные типы не являются ковариантными.

List<BImpl> не является подклассом List<B>.

Часть контракта метода в интерфейсе A состоит в том, что он возвращает List<B>.

public interface A {
 List<B> getBs();
}

A List<BImpl> не поддерживает этот контракт. Например, получатель, ожидающий List<B>, может попытаться добавить в список экземпляры других типов B, например, BImpl2 и BImpl3.

.

A List<B>, содержащий только BImpl, будет поддерживать контракт.

3 голосов
/ 22 декабря 2010

Только если вы можете изменить определение метода A.getBs() на:

List<? extends B> getBs();
...