簡體   English   中英

Java 8 - 使用lambdas推斷泛型返回類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM