问题描述
在面向对象编程中,“为接口编程”通常被认为是最佳实践。由于一个接口可以有许多实现,我们的想法是我们应该能够轻松地将一个实现替换为另一个实现。 但是,当接口方法的返回类型是 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 (将#修改为@)