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

时间:2013-11-19 13:46:02

标签: 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());
    }
}

2 个答案:

答案 0 :(得分:7)

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

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

您可以实施一种方法:

public static <In, Out> List<Out> makeList(In in) {
    return new ArrayList<Out>();
}

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

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

System.out.println(f.apply("Hi").size());

答案 1 :(得分:0)

我不确定您正在尝试使用ArrayList,但您还需要将类型声明添加到接口。以下示例将编译:

public class Test {

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

    public static void main(String... args) {
        SolveFunction<String, Integer> f = new SolveFunction<String, Integer>() {

            @Override
            public Integer apply(String in) {
                return in.length();
            }
        };

        System.out.println(f.apply("Hi")); // Prints 2
        System.out.println(f.apply("HELLO")); // Prints 5
    }
}