如何在接口方法中使用带有列表的协变返回类型?

问题描述

在面向对象编程中,“为接口编程”通常被认为是最佳实践。由于一个接口可以有许多实现,我们的想法是我们应该能够轻松地将一个实现替换为另一个实现。 但是,当接口方法的返回类型是 List 时,我很难理解如何执行此操作。

例如,假设我需要获取有关 NBA(篮球)球员的数据。这些数据的两个提供者可能是 ESPN 和雅虎。 ESPN 和雅虎都会提供球员的某些字段,比如他们的 name。但是,ESPN 拥有 Yahoo 没有的有关玩家 college 的信息。雅虎可能有关于球员 age 的信息,而 ESPN 没有。

public abstract class Player {
  private String name;
}
public class EspnPlayer extends Player {
  private String college;
}
public class YahooPlayer extends Player {
  private int age;
}

我希望能够在 ESPN 和 Yahoo 提供商之间进行切换,因此我编写了一个带有实现的接口。
客户端代码:

public class PlayerController {
  
  public List<Player> getPlayers() {
    NbaService nbaService = new EspnServiceImpl(); // or YahooServiceImpl
    return nbaService.getPlayers();
  }
}

接口和实现:

public interface NbaService {
  List<Player> getPlayers();
}
public class EspnServiceImpl implements NbaService {

  @Override
  public List<EspnPlayer> getPlayers() {
    List<EspnPlayer> espnPlayers = new ArrayList<>();
    // call ESPN API and get ESPN players
    return espnPlayers;
  }
}

这不会编译。我认为这会起作用,因为协变返回类型。现在,如果我将接口方法更改为 List<? extends Player> getPlayers();,一切都会编译。但是,我不确定这是否是一个好习惯。有人可以帮助我了解我缺少哪些概念吗?谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)