【发布时间】:2017-01-12 22:46:51
【问题描述】:
假设我想编写一个方法buildBiFxnWithSameTypeArgs,它产生一个两个参数BiFunction,其输入参数的类型相同。事先不知道(即何时调用buildBiFxnWithSameTypeArgs)具体是什么类型——我只是希望编译器强制执行,每当调用buildBiFxnWithSameTypeArgs返回的函数时,提供给它的参数的类型必须匹配。本质上,最终效果应该是 lambda 等价物,对于方法定义中的两个参数的类型使用相同的泛型类型参数。
我最初的尝试如下所示:
public interface ConstrainedBiFunction<I, O> extends BiFunction<I, I, O> {}
public static ConstrainedBiFunction<?, String> buildBiFxnWithSameTypeArgs() {
return (inputOne, inputTwo) -> String.valueOf(inputOne) + String.valueOf(inputTwo);
}
public void test() {
buildBiFxnWithSameTypeArgs().apply(Integer.valueOf(1), Integer.valueOf(2));
}
然而,通配符类型参数? 似乎不能以这种方式使用; apply 步骤编译失败,出现以下错误:
apply (capture<?>, capture<?> in BiFunction cannot be applied to (java.lang.Integer, java.lang.Integer)
是否有可能返回一个参数类型被推断出来的 lambda 函数,然后以这种方式相互约束?
编辑:为这个不太好的问题道歉;我有一个更复杂的问题,我试图抓住它的本质,以便在这里提出最简单的问题,但看起来我把问题简化得太多了。当然,我知道所有类都继承自Object,所以在这个问题的过度简化再现中,@shmosel 和@JB Nizet 提出的解决方案有效。一旦我更好地提炼了原始问题,我将发布一个新问题。
【问题讨论】:
-
您认为
ConstrainedBiFunction<?, String>与.apply(Integer.valueOf(1), Integer.valueOf(2));有何关系? -
所有类最终都继承自 Object,因此即使您传递了例如 Banana 和 Truck,编译器也会将其推断为 ConstrainedBuFunction
标签: java generics lambda types type-inference