【发布时间】:2014-07-14 20:22:39
【问题描述】:
嗯,我们有FunctionalInterface:
public interface Consumer<T> {
void accept(T t);
}
我可以像这样使用它:
.handle(Integer p -> System.out.println(p * 2));
我们如何在代码中解析该 lambda 参数的实际 generic type?
当我们将它用作内联实现时,从该类的方法中提取Integer 并不难。
我错过了什么吗?或者只是 java 不支持 lambda 类?
为了更干净:
该 lambda 用 MethodInvoker 包装(在提到的 handle 中),它在其 execute(Message<?> message) 中提取实际参数以用于进一步的反射方法调用。在此之前,它使用 Spring 的 ConversionService 将提供的参数转换为目标参数。
本例中的方法handle是在真正的应用程序工作之前的一些配置器。
不同的问题,但对同一问题的解决方案的期望:Java: get actual type of generic method with lambda parameter
【问题讨论】:
-
不确定我是否理解;在您的示例中,您可以不使用
Integer,编译器会在此处进行类型推断。 -
没有。我真的需要知道那个类型:我们有一些
converter子系统可以将"2"转换为int(最简单的示例),如果它可以确定参数的类型。否则我们最终会得到java.lang.String cannot be cast to java.lang.Integer。拥有该 Java 以某种方式理解实际类型。但是我怎样才能从代码中做到这一点? -
再来一次:我想知道方法参数的实际泛型类型。我可以为课程做到这一点,但不能为 lambdas 做。就这样。不要试图理解我的应用程序的逻辑——它是 Spring,它有强大的
Converter子系统。例如。我可以编写和注册一些UserToPersonConverter并将User发送给我的消费者,它将被转换为Person方法参数。它适用于内联类,但不适用于 lambdas -
反射调用了什么?请使用所有这些相关信息编辑您的问题。
-
你可以在我的项目github.com/spring-projects/spring-integration-java-dsl中找到它。泛型解析是通过一个额外的
Class<T>参数完成的:github.com/spring-projects/spring-integration-java-dsl/blob/… 和一个内部解决方案LambdaMessageProcessor为我们做这些事情。没有第三方,顺便说一句:只是当前状态下的 Java...