相关疑难解决方法(0)

Java 8 Lambdas上的反射类型推断

我正在尝试Java 8中的新Lambdas,我正在寻找一种方法来使用lambda类的反射来获得lambda函数的返回类型.我特别感兴趣的是lambda实现了一个通用的超接口.在下面的代码示例中,MapFunction<F, T>是通用的超接口,我正在寻找一种方法来找出绑定到泛型参数的类型T.

虽然Java在编译器之后丢弃了许多泛型类型信息,但是泛型超类和通用超接口的子类(和匿名子类)确实保留了该类型信息.通过反射,可以访问这些类型.在下面的例子(情况1) ,反射告诉我,所述MyMapper的实施MapFunction结合java.lang.Integer到一般类型参数T.

即使对于本身是通用的子类,也有一些方法可以找出与泛型参数绑定的内容,如果已知其他一些参数.考虑壳体2在下面的例子中,IdentityMapper其中两个FT结合到相同的类型.当我们知道这一点时,F如果我们知道参数类型T(在我的例子中,我们知道),我们知道类型.

现在的问题是,如何才能实现Java 8 lambdas的类似功能?由于它们实际上不是通用超接口的常规子类,因此上述方法不起作用.具体来说,我可以计算出的parseLambda结合java.lang.IntegerT,而identityLambda结合同向FT

PS:理论上应该可以反编译lambda代码,然后使用嵌入式编译器(如JDT)并进入其类型推断.我希望有一个更简单的方法来做到这一点;-)

/**
 * The superinterface.
 */
public interface MapFunction<F, T> {

    T map(F value);
}

/**
 * Case 1: A non-generic subclass.
 */
public class MyMapper implements MapFunction<String, Integer> {

    public Integer map(String value) …
Run Code Online (Sandbox Code Playgroud)

java generics reflection lambda java-8

50
推荐指数
5
解决办法
1万
查看次数

Java 8 lambdas是作为内部类,方法还是其他东西编译的?

我今天读过这篇关于lambdas的文章:

http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood

文章建议,lambda 不是 作为anon内部类实现的(由于性能).它给出了一个示例,可以将lambda表达式编译为类的(静态)方法.

我试过一个非常简单的片段:

private void run() {
    System.out.println(this);
    giveHello(System.out::println);
}

private void giveHello(Consumer<String> consumer) {
    System.out.println(consumer);
    consumer.accept("hello");
}
Run Code Online (Sandbox Code Playgroud)

输出是:

sample.Main@14ae5a5
sample.Main$$Lambda$1/168423058@4a574795
hello
Run Code Online (Sandbox Code Playgroud)

所以它不是同一个实例.它不是一些中央的"Lambda Factory"实例.

那么lambdas是如何实现的?

java lambda java-8

16
推荐指数
1
解决办法
2315
查看次数

键入擦除在Java Map类中不起作用

我使用javap反编译了Map类.类定义仍然显示了泛型类型K和V的存在.这应该已经被类型擦除的概念所删除.为什么不会发生这种情况?

./javap -verbose java.util.Map

Classfile jar:file:/opt/jdk1.8.0_101/jre/lib/rt.jar!/java/util/Map.class
    Last modified 22 Jun, 2016; size 4127 bytes
    MD5 checksum 238f89b3e2ff9bebe07aa22b0a3493a9
    Compiled from "Map.java"

public interface java.util.Map<K extends java.lang.Object, V extends java.lang.Object>
    minor version: 0
    major version: 52
    flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT

Constant pool:
Run Code Online (Sandbox Code Playgroud)

java generics type-erasure

4
推荐指数
2
解决办法
236
查看次数

标签 统计

java ×3

generics ×2

java-8 ×2

lambda ×2

reflection ×1

type-erasure ×1