Java 如何在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

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