Java 8 - 使用 lambda 推断泛型 return 类型
Java 8 - Inferring generic return type with lambdas
我试图在 Java 8 中的一些高阶函数中保留 lambda 表达式的 return 类型的通用类型信息。我已将我的实际代码简化为这样测试用例。问题不在于我期望代码完全执行的操作,而是我期望泛型类型 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
的 return 类型并报告 Object
而不是 String
这是我所希望的。
如何获得正确的通用类型边界,以便正确的 return 类型,即 java.lang.String
是 inferred 由编译器?
我不认为它可以在没有转换的情况下修复(也许有人知道得更多)。另一种方法是将您的语句分成两行:
Function<Function<Integer, String>, String> thing2 = adamTest.thing2(7);
final String s = thing2.apply(i -> i.toString());
还要注意thing2
可以简化为:
private <R> Function<Function<Integer, R>, R> thing2(final Integer val) {
return fn1(i -> (op -> op.apply(val * i)));
}
如前所述,这些语句是从左到右计算的。
要强制编译器使用正确的类型,你可以简单地写成
final String s = adamTest.<String>thing2(7).apply(String::valueOf);
编辑:根据评论,lambda 表达式可以替换为方法引用(看起来更干净)。
我试图在 Java 8 中的一些高阶函数中保留 lambda 表达式的 return 类型的通用类型信息。我已将我的实际代码简化为这样测试用例。问题不在于我期望代码完全执行的操作,而是我期望泛型类型 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
的 return 类型并报告 Object
而不是 String
这是我所希望的。
如何获得正确的通用类型边界,以便正确的 return 类型,即 java.lang.String
是 inferred 由编译器?
我不认为它可以在没有转换的情况下修复(也许有人知道得更多)。另一种方法是将您的语句分成两行:
Function<Function<Integer, String>, String> thing2 = adamTest.thing2(7);
final String s = thing2.apply(i -> i.toString());
还要注意thing2
可以简化为:
private <R> Function<Function<Integer, R>, R> thing2(final Integer val) {
return fn1(i -> (op -> op.apply(val * i)));
}
如前所述,这些语句是从左到右计算的。
要强制编译器使用正确的类型,你可以简单地写成
final String s = adamTest.<String>thing2(7).apply(String::valueOf);
编辑:根据评论,lambda 表达式可以替换为方法引用(看起来更干净)。