【发布时间】:2015-03-06 11:48:57
【问题描述】:
我试图在 Java 8 中的一些高阶函数中保留来自 lambda 表达式的返回类型的通用类型信息。我已将我的实际代码简化为这个测试用例。问题不在于我期望代码完全执行的操作,而是我期望泛型类型R 被推断为java.lang.String 并通过函数调用进行。
import java.util.function.Function;
public class AdamTest {
public final static void main(final String args[]) {
final AdamTest adamTest = new AdamTest();
final String s = adamTest.thing2(7).apply(i -> i.toString());
System.out.println(s);
}
private <R> R fn1(final Function<Integer, R> op) {
return op.apply(10);
}
private <R> Function<Function<Integer, R>, R> thing2(final Integer val) {
return fn1(i -> new Function<Function<Integer, R>, R>() {
@Override
public R apply(Function<Integer, R> op) {
return op.apply(val * i);
}
}
);
}
}
由于final String s = adamTest.thing2(7).apply(i -> i.toString()); 这一行,目前这段代码无法编译。我认为我的类型界限有些微妙的错误,因为编译器似乎无法推断出thing2(7).apply 的返回类型并报告Object 而不是我希望的String。
如何获得正确的泛型类型边界,以便编译器推断正确的返回类型,即java.lang.String?
【问题讨论】:
-
你能添加你得到的错误吗?
-
编译器从左到右“评估”表达式;问题出现在
adamTest.thing2(7)。编译器不会查看.apply来确定类型,否则就不可能。 -
你到底想做什么?这完全不清楚。
-
感谢@AdrianLeonhard,这是我正在寻找的解释。
-
你为什么要以这种不一致的方式混合 lambdas 和内部类?为什么不将
thing2实现为return fn1(i -> op -> op.apply(val * i));?
标签: java generics lambda java-8