【问题标题】:Java: get actual type of generic method with lambda parameter [duplicate]Java:使用 lambda 参数获取泛型方法的实际类型
【发布时间】:2014-05-26 08:31:06
【问题描述】:

我在这里Java: how to resolve generic type of lambda parameter?问了一些关于lambdas的问题,但是这个有点不同。

我有方法签名:

public <P> void handle(Consumer<P> consumer) {
...
}

我可以和lambda一起使用它:

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

我能以某种方式解决实际的泛型类型吗? 我的意思是我想在 handle 方法中获得 Integer.class

顺便说一句,我可以这样解决问题:

 public <P> void handle(Class<P> pClass, Consumer<P> consumer) {...}

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

但是,如果我们将 lambda 更改为内联实现,它看起来并不可靠。

【问题讨论】:

  • 没有。否则,您可能会将该主题作为一个有很多问题的主题来结束。他们提供不同的主题并期待不同的答案
  • 我不确定这两个问题的区别。
  • 老实说我也不明白
  • 这是可能的——您只需在将 lambda 传递给handle 之前获取对 lambda 的引用,这样您就可以解析其类的类型参数。例如:TypeResolver.resolveRawArgument(Consumer.class, lambda.getClass());。有关更多使用信息,请参阅TypeTools
  • @ArtemBilan - 另一种选择是从您的句柄方法内部进行类型解析:TypeResolver.resolveRawArgument(Consumer.class, consumer.getClass()); 这应该可以。

标签: java generics lambda


【解决方案1】:

不,这是不可能的。

你不能得到像T.class 这样的东西,因为泛型在运行时会被删除。您确实需要传入Class&lt;T&gt; 才能获取课程本身。

我还闻到了 XY 问题。也许您真的需要类类型,但没有更多信息,这有点味道。

【讨论】:

  • 好。我接受了答案并继续解决方案
  • 是的,它可以重新创建 T 的值,因为它作为 lambda 方法调用的一部分在字节码中被捕获。有关示例,请参见 TypeTools
  • 同意@Jonathan,您可以获取类型,它们通过获取类型的常用方法被擦除,但这并不意味着它们在运行时被完全擦除,它们仍然存在并且可以通过不同的方式获得,例如docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多