当前位置: 首页 > 面试题库 >

Java:如何解析Lambda参数的通用类型?

井兴怀
2023-03-14
问题内容

好吧,我们有FunctionalInterface

public interface Consumer<T> {

    void accept(T t);

}

我可以像这样使用它:

.handle(Integer p -> System.out.println(p * 2));

我们如何generic type在代码中解析该lambda参数的实际值?

当我们将其用作内联实现时,Integer从该类的方法中提取并没有那么困难。

我想念什么吗?或者只是Java不支持lambda类?

为了更清洁:

该lambda被包裹MethodInvoker(在提到的中handle),它在execute(Message<?> message)提取实际参数以进行进一步的反射方法调用。在此之前,它使用Spring的将提供的参数转换为目标参数ConversionService

handle在这种情况下,方法是在实际应用程序工作之前进行一些配置。


问题答案:

我最近在TypeTools中添加了对解析lambda类型参数的支持。例如:

MapFunction<String, Integer> fn = str -> Integer.valueOf(str);
Class<?>[] typeArgs = TypeResolver.resolveRawArguments(MapFunction.class, fn.getClass());

解析的类型args符合预期:

assert typeArgs[0] == String.class;
assert typeArgs[1] == Integer.class;

注意:基础实现使用@danielbodart概述的ConstantPool方法,该方法已知可在Oracle JDK和OpenJDK上使用。



 类似资料:
  • 所有人。 在Oracle关于缩减的教程(https://docs.Oracle.com/javase/tutorial/collections/streams/Reduction.html)中,我们提供了如何使用stream.collect()方法的示例。任务是查找流中值的平均值。本例中有辅助类平均器: 然后我们就有了这样的结果: ,其中BiConsumer-具有函数方法accept(Object

  • 问题内容: 我在这里问了一些Java问题:如何解析lambda参数的通用类型?,但这有点不同。 我有方法签名: 我可以使用它: 我可以以某种方式解析该实际的泛型类型吗?我的意思是我想进入那种方法。 顺便说一句,我可以解决这样的问题: 但是,如果我们将lambda更改为内联实现,它看起来就不符合要求。 问题答案: 不,这是不可能的。 您无法获得类似的信息,因为泛型会在运行时被擦除。您确实需要传递权限

  • 问题内容: 我正在编写一个网络类,并希望能够解析对不同类的不同响应(仍然存在一对一的关系,但是我想拥有一个可以处理来自不同端点的所有响应的单个类,并具有预期的 classType 我应该映射到): 但是如果我写的话就会出错 更新 :可能更好的选择是将方法添加到类: 但是仍然存在相同的类型错误。 问题答案: 您应该将反序列化与应用程序的其他部分分开。您不能为所有响应实现一种方法,但是响应数量可能有限

  • 问题内容: 想象以下情况: 我正在专门使用反射来分析MyClass ,在这种情况下,我将获得以下字段(和Types,使用Field的getType()): 我想获取T的实际Type,由于扩展符号中的显式“ String”,因此在运行时就知道了它,我该如何获取myField的非遗传类型? 解决的编辑: 答案似乎是“你做不到”。对于以后可能看这个问题的人,我建议使用Jackson(我试图这样做来生成J

  • 我正在研究创建一个基于HTTP客户端的通用spint webflow并运行代码 <代码>公共 这与<代码> 响应包装器之前是否需要

  • 问题内容: 在Java中解析命令行参数的好方法是什么? 问题答案: 例如,这是你用来解析2个字符串参数的方法: 从命令行使用: