Java 泛型映射键应该只允许两个类,值为一个类
使用泛型,我想使我的方法参数化,以接受键(A或B)和值的映射作为模型,然后将其转换为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(
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方法(MapIfA
和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
。