[英]Java 8 - Inferring generic return type with lambdas
我試圖在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
?
如前所述,這些陳述從左到右進行評估。
要強制編譯器使用正確的類型,您只需將其編寫為
final String s = adamTest.<String>thing2(7).apply(String::valueOf);
編輯:根據注釋,lambda表達式可以替換為方法引用(看起來更干凈)。
我不認為沒有演員陣容可以修復(也許有人知道更好)。 另一種方法是將您的陳述分為兩行:
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)));
}
您需要轉到編譯器的設置以啟用lambda表達式。 這是intellij的一個例子。 它在文件>項目結構下,然后是這個下拉列表。 希望這可以幫助!
nvm,聲譽不夠。 但我提供了詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.