Java 如何保持lambdas的参数类型?

Java 如何保持lambdas的参数类型?,java,reflection,type-erasure,Java,Reflection,Type Erasure,这是一个奇怪的Java反射问题,由于类型擦除而发生: <P, R> void printIt(Function<P, R> function) { inner(function); } private void inner(Object function) { for (Method method : function.getClass().getDeclaredMethods()) { Syste

这是一个奇怪的Java反射问题,由于类型擦除而发生:

<P, R> void printIt(Function<P, R> function) {
        inner(function);
    }

    private void inner(Object function) {
        for (Method method : function.getClass().getDeclaredMethods()) {
            System.out.println(method);
        }
    }

    @Test
    public void testAnyHandler() {
        printIt((String a) -> "Hello");
    }

真是太遗憾了。。。有没有办法保存这些参数?

不,编译器没有保存这些数据。您可以为lambda创建单独的类:

interface StringFunc extends Function<String, String> {}
但我看不到获取lambda声明类的选项(但可以从类名中提取),也看不到如何将方法与lambda+匹配,因为它是特定于实现的,所以可能无法在每个jvm版本上工作。此方法还将包括传递给lambda的局部变量类型:

    int dd = "dddd".length() + args.length;
    Function<String, String> x = (String a) -> a + dd;
因此,最好的办法可能是将类型作为单独的参数传递:

public <F, T> Whatever method(Class<F> typeF, Class<T> typeT, Function<F, T> func)
public方法(类typeF、类typeT、函数func)
“有没有办法保留这些参数?”-没有。也许在未来的某个时刻会有。
    Function<String, String> x = (String a) -> a;
    printIt(x);

    for (Method declaredMethod : Test.class.getDeclaredMethods()) {
        if (declaredMethod.isSynthetic()) {
            System.out.println(declaredMethod);
        }
    }
}
public java.lang.Object org.gotofinal.Test$$Lambda$14/0x0000000800066840.apply(java.lang.Object)
private static java.lang.String org.gotofinal.Test.lambda$main$0(java.lang.String)
    int dd = "dddd".length() + args.length;
    Function<String, String> x = (String a) -> a + dd;
private static java.lang.String org.gotofinal.Test.lambda$main$0(int,java.lang.String)
public <F, T> Whatever method(Class<F> typeF, Class<T> typeT, Function<F, T> func)