Java 泛型映射键应该只允许两个类,值为一个类

Java 泛型映射键应该只允许两个类,值为一个类,java,generics,Java,Generics,使用泛型,我想使我的方法参数化,以接受键(A或B)和值的映射作为模型,然后将其转换为map的映射 问题是我在entry.getKey().getId()b/c上遇到了一个错误。我还没有定义什么是?钥匙。有人能帮忙吗 public void method(Map<?, Model> map) { Map<UUID, Model> transformation = map.entrySet().stream() .collect(

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

问题是我在
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
}

public void方法(MapIf
A
B
实现一个公共接口,提供
getId()
方法,将通配符绑定为:

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

public void方法(Map因为
A
B
都扩展了
S
,所以
Map
的通用键可以是
S

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

公共作废方法(请注意,这不会接受
Map
作为参数。他可以将
作为自定义类型来模拟密封集,但这需要在Map实现中使用一些自定义代码。@M.Prokhorov您可以帮助自定义实现吗?@d-man,您必须进行自定义实现吗?我会根据通常,除非您真的需要模拟密封类型。但是,如果不严格重写代码,您就无法在其中添加第三种类型。或者,如果不需要,就添加接口exists@StoyanRadnev相关:您可以通过实现一个自定义类型来解决这个问题:
(或者从某个库中获取一个)。它会在一定程度上影响您的类型签名,但最终会给您带来类型安全方面的好处。另一方面,我认为在实现一个字典时没有实际用途,其中键可以是两个完全不相关的东西之一,我宁愿为此有两个单独的映射……请进一步阅读(我肯定是瞎了!),您确实有一个公共类型
S
。然后按照答案建议,使用
?extends S
@M.Prokhorov即使没有公共类型,一个侵入性较小的解决方案将是为提取UUID的方法提供一个函数参数:
方法(mapOfA,a::getId)
@AndyTurner,没错,他可以向转换方法“解释”如何通过添加函数参数从任何键类型获得
UUID