【发布时间】:2014-03-25 22:57:29
【问题描述】:
在做一些基本的 lambda 练习时,一个明显相同的匿名内部类的输出给我的输出与 lambda 不同。
interface Supplier<T> {
T get(T t);
}
场景 #1
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer get(Integer t) {
return t;
}
};
Supplier<Integer> s2 = t -> t;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
输出 2 和 2。这里没有什么新鲜事。
但是当我这样做时:
场景 #2
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer get(Integer t) {
return t++;
}
};
Supplier<Integer> s2 = t -> t++;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
输出 2 和 3
问题:两个输出不应该相同吗?我错过了什么吗?
为了完整起见: 场景 #3
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer get(Integer t) {
return ++t;
}
};
Supplier<Integer> s2 = t -> ++t;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
输出 3 和 3。这里也没有什么新东西。
更新:仍然从 1.8.0-b132 获得相同的输出
更新 #2:错误报告: https://bugs.openjdk.java.net/browse/JDK-8038420
更新 #3:javac 中的错误已修复,您现在应该可以获得相同的结果。
【问题讨论】:
-
我得到 2 和 2 作为你的第二个 sn-p。
-
+1 表示无法复制
-
嗯,这很有趣。我们是否在这里查看与 JVM 版本/构建相关的内容?我正在使用构建 1.8.0-ea-b81。目前正在下载更新的版本。将发布更新。
-
我在 MacOS X Mavericks 上重现了该错误。
java -version的输出:java 版本“1.8.0”Java(TM) SE 运行时环境(构建 1.8.0-b132)Java HotSpot(TM) 64 位服务器 VM(构建 25.0-b70,混合模式) -
我可以用
Java(TM) SE Runtime Environment (build 1.8.0-ea-b118)重现它,但不能在任何 JRE8 Eclipse 使用的地方重现。
标签: java lambda java-8 anonymous-inner-class