我正在尝试使用Java 8中的新Lambda,并且正在寻找一种在lambda类上使用反射来获取lambda函数的返回类型的方法。我对lambda实现通用超级接口的情况特别感兴趣。在下面的代码示例中,MapFunction<F, T>是通用超级接口,我正在寻找一种方法来找出绑定到通用参数的类型T。
尽管Java在编译器之后丢弃了许多泛型类型信息,但泛型超类和泛型超接口的子类(和匿名子类)确实保留了该类型信息。通过反射,可以访问这些类型。在下面的示例(案例1)中,反射告诉我,绑定的MyMapper实现MapFunction绑定java.lang.Integer到泛型type参数T。
即使对于本身是泛型的子类,如果已知其他一些子类,也可以通过某些方法找出绑定到泛型参数的内容。在下面的示例中考虑案例2,IdentityMapper其中F和T绑定到相同类型。当我们知道这一点时,F如果我们知道参数类型T(我们就知道),就知道类型。
现在的问题是,如何实现Java 8 lambda的类似功能?由于它们实际上不是通用超级接口的常规子类,因此上述方法不起作用。具体来说,我可以计算出的parseLambda结合java.lang.Integer来T,而identityLambda结合同向F和T?
PS:从理论上讲,应该可以反编译lambda代码,然后使用嵌入式编译器(如JDT)并利用其类型推断。我希望有一种更简单的方法可以做到这一点;-)
智慧大石
白猪掌柜的
相关分类