【发布时间】:2019-01-18 23:38:19
【问题描述】:
使用泛型我想让我的方法参数化以接受键映射(A 或 B)和值作为模型,然后它转换为 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
}
【问题讨论】:
-
您可以通过实现自定义类型来解决这个问题:
Either<A, B>(或从某个库中获取一个)。它会在一定程度上影响您的类型签名,但最终实际上会给您带来类型安全的好处。另一方面,我认为在实现字典中没有实际用途,其中键可以是两个完全不相关的事物之一,我宁愿为此使用两个单独的映射。 -
... 多读一点(我肯定是瞎子!),你确实有一个共同的类型
S。然后按照答案的建议,使用? extends S。 -
@M.Prokhorov 即使没有通用类型,侵入性较小的解决方案是为提取 UUID 的方法提供功能参数:
method(mapOfA, A::getId)。 -
@AndyTurner,是的,他只是“解释”了转换方法如何通过添加函数参数从任何键类型中获取
UUID。