Bifunction签名中有界类型参数的语法

时间:2018-01-12 17:11:10

标签: java

想要更新此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 ;

1 个答案:

答案 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);