我收到以下代码错误(如代码段所述):

public class MyClass {
  private Map<String, Subclass1> mapToSubclass1;
  private Map<String, Subclass2> mapToSubclass2;

  public void update(
      final boolean updatesAreSubclass1,
      final List<? extends Superclass> updates) {

    Map<String, Superclass> mapToUpdate;
    if (updatesAreSubclass1) {
      mapToUpdate = mapToSubclass1;
    } else {
      mapToUpdate = mapToSubclass2;
    }


    updates.stream().forEach((entity) -> {
      mapToUpdate.put(entity.getId(), entity);
    });
  }
}


其中Subclass1Subclass2扩展Superclass,而Superclass提供public String getId();

如所写,尝试定义mapToUpdate-Incompatible types. Required: Map<String, foo.bar.Superclass>, Found: Map<String, foo.bar.Subclass1>(或else类中的Subclass 2)时出现错误。

如果将mapToUpdate更改为Map<String, ? extends Superclass>,则尝试尝试put-Wrong 2nd argument type. Found: 'foo.bar.Superclass', required '? extends foo.bar.Superclass'时出现错误

我认为这与协方差的概念有关,但是我不确定如何解决该问题。我提出了几个解决方案,但都不令人满意:


我是否需要两个update方法,每个子类一个(如果有两个以上,这将很快变得混乱)?
我应该在put子句中移动if (updatesAreSubclass1)并将updates强制转换为适当的List<Subclass>吗?

最佳答案

这是一个解决方案,它将与无限数量的可能的子类一起使用,因为据我所知,您只是在创建类加Id->超类的映​​射。

private Map<Class,Map<String,Superclass>> map = new HashMap<>();
void update(List<? extends Superclass> l) {
    l.stream().forEach(o -> put(o));
}

public void  put(Superclass obj) {
    String id = obj.getId();
    Map<String,Superclass> submap = map.get(obj.getClass());
    if(null == submap) {
        submap = new HashMap<>();
        map.put(obj.getClass(), submap);
    }
    submap.put(id, obj);
}

public Superclass get(Class clss, String id) {
    return Optional.ofNullable(map)
            .map(m -> m.get(clss))
            .map(m2 -> m2.get(id))
            .orElse(null);
}

关于java - 使用泛型的Map.put,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33595461/

10-12 14:17