【发布时间】:2019-05-06 10:59:57
【问题描述】:
我有以下程序无法编译:
只需块 1 编译良好并按预期工作 - 我可以有条件地选择一个对象并内联调用它的方法。
块 2 也可以正常编译并按预期工作 - 我可以有条件地将方法引用分配给 Supplier<String> 变量并在该变量上调用 .get()。
然而块 3 编译失败:
Lambda.java:31: error: method reference not expected here
String res = ((Supplier<String>) (args.length > 0 ? Lambda::foo : Lambda::bar)).get();
^
Lambda.java:31: error: method reference not expected here
String res = ((Supplier<String>) (args.length > 0 ? Lambda::foo : Lambda::bar)).get();
我认为结合块 1 和块 2 中的想法我将能够执行块 3,因为 ((Supplier<String>) (args.length > 0 ? Lambda::foo : Lambda::bar)) 的类型是 Supplier<String>。
import java.util.function.Supplier;
class Lambda {
private final String s;
private Lambda(String s) {
this.s = s;
}
private static String foo() {
return "foo";
}
private static String bar() {
return "bar";
}
private String str() {
return s;
}
public static void main(String... args) {
// Block 1
Lambda l1 = new Lambda("x");
Lambda l2 = new Lambda("y");
System.out.println((args.length > 0 ? l1 : l2).str());
// Block 2
Supplier<String> s = (args.length > 0 ? Lambda::foo : Lambda::bar);
System.out.println(s.get());
// Block 3
String res = ((Supplier<String>) (args.length > 0 ? Lambda::foo : Lambda::bar)).get();
System.out.println(res);
}
}
要明确:我不是在这里寻找解决方法,这首先不是高质量的代码。我只是好奇为什么最后一个块无法编译。
【问题讨论】:
-
像
Supplier<String> s = (args.length > 0 ? Lambda::foo : Lambda::bar);这样的 lambda 表达式真的让我感到惊讶,你能指出我以不同方式编写 lambda 表达式的任何文档页面 -
@Deadpool 此示例中没有 lambda 表达式。
Lambda::foo和Lambda::bar是方法引用,它们没有什么特别之处。args.length > 0? expression1: expression2形式的表达式就是三元运算符。
标签: java language-lawyer method-reference