如何在lambda中使用泛型函数接口方法类型参数

use*_*761 4 java generics lambda java-8

我试图创建一个通用的lambda,所以我不需要为个别类型重新定义它.为此,我需要访问传递给函数的类型参数.不幸的是,我没有找到任何关于如何做到这一点的文档.

这是我想要做的一个例子,但在lambda的前面不会编译:

import java.util.ArrayList;

public class Test {

    interface SolveFunction {
        <In, Out> Out apply(In in);
    }

    public static void main(String...args) {
        SolveFunction f = <In, Out> (In a)  -> {
            ArrayList<Out> list = new ArrayList<>();
            return list;
        };
        System.out.println(f.<String, Integer>apply("Hi").size());
    }
}
Run Code Online (Sandbox Code Playgroud)

Jes*_*per 7

首先,将类型参数添加到接口本身:

interface SolveFunction<In, Out> {
    Out apply(In in);
}
Run Code Online (Sandbox Code Playgroud)

你可以实现一个方法:

public static <In, Out> List<Out> makeList(In in) {
    return new ArrayList<Out>();
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将其用作lambda的实现:

SolveFunction<String, Integer> f = Test::makeList;

System.out.println(f.apply("Hi").size());
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,您甚至不需要`SolveFunction`接口,标准库中已经有一个看起来相同的接口:`java.util.function.Function <T,R>`. (3认同)