Java 如何在lambda中使用泛型函数接口方法类型参数
我试图创建一个通用的lambda,所以我不需要为单个类型重新定义它。为此,我需要访问传递给函数的类型参数。不幸的是,我没有找到任何关于如何做到这一点的文档 这是我想做的一个示例,但lambda前面的代码无法编译:Java 如何在lambda中使用泛型函数接口方法类型参数,java,generics,lambda,java-8,Java,Generics,Lambda,Java 8,我试图创建一个通用的lambda,所以我不需要为单个类型重新定义它。为此,我需要访问传递给函数的类型参数。不幸的是,我没有找到任何关于如何做到这一点的文档 这是我想做的一个示例,但lambda前面的代码无法编译: import java.util.ArrayList; public class Test { interface SolveFunction { <In, Out> Out apply(In in); } public sta
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());
}
}
import java.util.ArrayList;
公开课考试{
界面解算函数{
向外(向内)应用;
}
公共静态void main(字符串…参数){
解算函数f=(在a中)->{
ArrayList=新建ArrayList();
退货清单;
};
System.out.println(f.apply(“Hi”).size();
}
}
首先,将类型参数添加到接口本身:
interface SolveFunction<In, Out> {
Out apply(In in);
}
接口函数{
向外(向内)应用;
}
您可以实现一种方法:
public static <In, Out> List<Out> makeList(In in) {
return new ArrayList<Out>();
}
公共静态列表生成列表(In){
返回新的ArrayList();
}
然后可以将其用作lambda的实现:
SolveFunction<String, Integer> f = Test::makeList;
System.out.println(f.apply("Hi").size());
SolveFunction f=Test::makeList;
System.out.println(f.apply(“Hi”).size();
我不确定您使用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
}
}
公共类测试{
界面解算函数{
向外(向内)应用;
}
公共静态void main(字符串…参数){
SolveFunction f=新的SolveFunction(){
@凌驾
公共整数应用(字符串输入){
返回.length();
}
};
System.out.println(f.apply(“Hi”);//打印2
System.out.println(f.apply(“HELLO”);//打印5
}
}
你到底想做什么?这段代码中有很多东西是无法编译的……我正在尝试实现分而治之的模式,它接受4个函数:分而治之、求解、平凡和组合,下面是一段较大的代码,为什么我希望在lambda中包含泛型(代码尚未测试,因为在我尝试编译它时,在泛型处它会中断)仅供参考,这不是生产代码,我知道Java不适合用作函数式语言。但它不使用Java 8 lambda语法,该方法使用具体类型(String
和Integer
)而不是类型参数。请注意,您甚至不需要SolveFunction
接口,标准库中已经有一个看起来相同的接口:java.util.function.function
。