Java:使用lambda参数获取实际类型的泛型方法

Art*_*lan 4 java generics lambda

lambdas在这里问了一些关于Java的问题:如何解析泛型类型的lambda参数?,但这个有点不同.

我有方法签名:

public <P> void handle(Consumer<P> consumer) {
...
}
Run Code Online (Sandbox Code Playgroud)

我可以用它lambda:

.<Integer>handle(p -> System.out.println(p * 2));
Run Code Online (Sandbox Code Playgroud)

我能以某种方式解决那个实际的泛型类型吗?我的意思是我想进入Integer.class那个handle方法.

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

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

 .handle(Integer.class, p -> System.out.println(p * 2));
Run Code Online (Sandbox Code Playgroud)

但是,如果我们将lambda更改为内联实现,它看起来就不会犹太了.

ski*_*iwi 5

不,这是不可能的.

你不能得到类似的东西T.class,因为泛型在运行时被删除.你真的需要传入Class<T>才能获得课程本身.

我也闻到了XY问题.也许你真的需要类型,但没有进一步的信息,这有点味道.

  • 是的****可以重新创建T的值,因为它是作为lambda方法调用的一部分在字节码中捕获的.有关示例,请参阅[TypeTools](https://github.com/jhalterman/typetools). (3认同)