泛型映射键应仅允许两个类,并且只允许一个类

时间:2019-01-18 14:58:11

标签: java generics

使用泛型,我想使我的方法参数化以接受键(A或B)和值的映射作为Model,然后将其转换为Map<UUID, Model>的映射

问题是我在entry.getKey().getId() b / c上遇到错误。我还没有定义什么?关键。有人可以帮忙吗?

public void method(Map<?, Model> map) {
  Map<UUID, Model> transformation =
      map.entrySet().stream()
          .collect(
              Collectors.toMap(entry -> entry.getKey().getId(), entry -> entry.getValue()));
}

class S {
  protected UUID getId() {
    // return UUID
  }
}

class A extends S {}

class B extends S {}

class Model {
  // bla bla
}

2 个答案:

答案 0 :(得分:1)

如果AB实现了提供getId()方法的通用接口,则将通配符与此绑定:

public void method(Map<? extends S, Model> map) {

答案 1 :(得分:0)

由于AB都扩展了S,因此map的通用密钥可以简单地是S

public void method(Map<? extends S, Model> map) {

除了创建S和{{都可以使用的接口之外,您目前无法采取其他措施来限制A的其他子级成为地图中的键(直到Java获得密封类)。 1}},然后将该接口用作B的通用密钥。