【发布时间】:2019-05-25 11:18:59
【问题描述】:
当我尝试编译这段代码时
import java.util.Optional;
public class GenericTest {
public static void main(String[] args) {
Optional.empty().map(o -> getStringClass(o)).orElse(String.class);
}
static Class<?> getStringClass(Object arg) {
return String.class;
}
}
javac 将失败并出现以下错误:
GenericTest.java:6: 错误:类 Optional 中的方法 orElse 不能应用于给定类型;
Optional.empty().map(o -> getStringClass(o)).orElse(String.class);
^
必需:类
找到:类
原因:参数不匹配; Class 无法转换为 Class
其中 T 是一个类型变量:
T 扩展类 Optional 中声明的 Object
其中 CAP#1 是一个新的类型变量:
CAP#1 从捕获的 ?
1 个错误
但是如果我改用方法引用,javac 将编译代码就好了:
import java.util.Optional;
public class GenericTest {
public static void main(String[] args) {
Optional.empty().map(GenericTest::getStringClass).orElse(String.class);
}
static Class<?> getStringClass(Object arg) {
return String.class;
}
}
为什么我使用方法引用或 lambda 表达式会有所不同?
根据我的理解,方法引用和 lambda 的类型都是Function<Object,Class<?>>,所以我看不出这里有什么区别。
顺便说一句,eclipse java编译器(ecj)不会同时编译这两个版本。
【问题讨论】:
-
您使用的是哪个版本的 javac?
-
请提供版本,这两种方式都无法为我编译。 Java-8
-
javac 1.8.0_172 和 javac 10.0.2。我知道 Java 10 不是最新的,但我已经安装了它,所以..
-
您使用哪种 Java 实现?你从哪里得到的,甲骨文?
-
java 版本 "1.8.0_172" Java(TM) SE Runtime Environment (build 1.8.0_172-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
标签: java lambda javac method-reference