想要更新此BiFunction以使用有界类型参数而不是上限有界通配符args。需要语法帮助。感谢。
public static final BiFunction<
Map<? extends Identifier, Map<DateTimeRange, Usage>>,
Map<Period, DateTimeRange>,
Map<Period, Map<? extends Identifier, Map<DateTimeRange, Usage>>>
> periodFilter = (usageMap, timeRangeMap) ->
// do something ;
答案 0 :(得分:1)
假设您希望将两个通配符绑定到相同的实际类型,这意味着您需要<K extends Identifier>
和此签名:
BiFunction<
Map<K, Map<DateTimeRange, Usage>>,
Map<Period, DateTimeRange>,
Map<Period, Map<K, Map<DateTimeRange, Usage>>>
>
为此,您需要一个静态方法来返回绑定类型,其中K
被解析为实际类型,而不是单个静态实例。
public static <K extends Identifier> BiFunction<
Map<K, Map<DateTimeRange, Usage>>,
Map<Period, DateTimeRange>,
Map<Period, Map<K, Map<DateTimeRange, Usage>>>
> getPeriodFilter() {
return (usageMap, timeRangeMap) -> /* do something */;
}
然后您可以像这样使用它:
Map<Identifier1, Map<DateTimeRange, Usage>> t = /* ... */;
Map<Period, DateTimeRange> u = /* ... */;
BiFunction<Map<Identifier1, Map<DateTimeRange, Usage>>,
Map<Period, DateTimeRange>,
Map<Period, Map<Identifier1, Map<DateTimeRange, Usage>>>
> filter = getPeriodFilter();
Map<Period, Map<Identifier1, Map<DateTimeRange, Usage>>> r = filter.apply(t, u);
如果您尝试使用K
,则推理引擎无法解析getPeriodFilter().apply(t, u)
,因此您必须明确指定它,这意味着您必须使用类名对其进行限定:
Map<Period, Map<Identifier1, Map<DateTimeRange, Usage>>> r =
MyClass.<Identifier1>getPeriodFilter().apply(t, u);