将不同子类插入到相应的哈希Map中

fumotvh3  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(373)

我有两门课, StockCrypto . 两者都是 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 }

我知道像这样的通配符hashmap中只能放null。我尝试了通配符文档中描述的helper方法解决方法,但仍然出现错误。我想找到一个解决方案,不需要为这两个子类重复第13-17行,因为这里需要的唯一方法是由超类实现的。

kpbwa7wx

kpbwa7wx1#

鉴于以上信息,我认为您可以做的最简单的事情是添加两个公共方法(一个) Stock 再来一次 Crypto )只需将正确的Map分派到通用私有 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 方法,只需选择正确的Map并将其传递给泛化 private add方法,该方法处理 T extends Security .

相关问题