gpt4 book ai didi

java - 如何保留 lambda 的参数类型?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:43 24 4
gpt4 key购买 nike

这是一个奇怪的 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");
}

结果是:

public java.lang.Object com.dariodario.sqlsmile.QueryTest$$Lambda$1/1607460018.apply(java.lang.Object)

真是可惜了...有什么方法可以保持参数吗?

最佳答案

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

interface StringFunc extends Function<String, String> {}

然后可以通过StringFunc超接口(interface)获取Function<String, String> .

或者只使用类而不是 lambda:

    printIt(new Function<String, String>() {
@Override
public String apply(String s) {
return s;
}
});

Lambda 还在它们声明的类中生成合成方法:

    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)

但我没有看到获取 lambda 声明类的选项(但可以从类名中提取)以及如何将方法与 lambda 匹配 + 它是特定于实现的,因此可能不适用于每个版本的 jvm。此方法还将包括传递给 lambda 的局部变量类型:

    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)

关于java - 如何保留 lambda 的参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58249066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com