我试图创建一个通用的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());
}
}
答案 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
}
}