如何解决将不同子类的插入推广到各自的 HashMap
我有两个类,Stock
和 Crypto
。两者都是 Security
的子类,这是它们获取下面调用的方法的地方。我想要一个通用方法,它接受其中之一并添加或更新相应的 HashMap。类似的东西:
1 class Portfolio {
2 private HashMap<String,Stock> stocks;
3 private HashMap<String,Crypto> cryptos;
4
5 public void add(Security s) {
6 HashMap<String,? extends Security> table;
7 if (s instanceof Stock)
8 table = stocks;
9 else if (s instanceof Crypto)
10 table = cryptos;
11 else
12 return;
13 if (table.containsKey(s.toString()))
14 table.get(s.toString()).addShares(s.getShares(),s.getAvgPrice());
15 else
16 table.put(s.toString(),s); //ERROR
17 totalEquity += s.getAvgPrice() * s.getShares();
18 }
19 }
我知道只能将 null 放入这样的通配符 HashMap 中。我尝试了通配符文档中描述的 helper method workaround,但仍然出现错误。我想找到一个不需要为两个子类重复第 13-17 行的解决方案,因为这里唯一需要的方法是由超类实现的。
解决方法
鉴于上述信息,我认为您可以做的最简单的事情是添加两个公共方法(一个采用 Stock
,另一个采用 Crypto
),它们只需将正确的映射分派到通用私有 {推断子类型的 {1}} 方法:
add
有了以上内容,您将能够执行以下操作:
public void add(Stock s) {
add(s,stocks);
}
public void add(Crypto c) {
add(c,cryptos);
}
private <T extends Security> void add(T s,Map<String,T> map) {
map.put(s.getName(),s); //<-- put into the right map
//or do whatever you want with it
}
编译器将分派到正确的 portfolio.add(new Stock("APPLE")); //<-- compiler sends it to the add(Stock s) method
portfolio.add(new Crypto("BTC")); //<-- compiler sends it to the add(Crypto c) method
方法,该方法将简单地选择正确的映射并将其传递给处理 public
的泛化 private
add 方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。