Java 为什么下面使用方法引用的转换不会产生编译错误? 公共类SomeClass{ 公共静态int-someFunction(int-a){ 返回a; } 公共静态void main(字符串[]args){ 消费者c=SomeClass::someFunction; } }
我不明白为什么:Java 为什么下面使用方法引用的转换不会产生编译错误? 公共类SomeClass{ 公共静态int-someFunction(int-a){ 返回a; } 公共静态void main(字符串[]args){ 消费者c=SomeClass::someFunction; } },java,java-8,Java,Java 8,我不明白为什么:consumerc=SomeClass::someFunction 不会产生编译错误,因为函数someFunction是一个具有返回值的方法,而使用者表示的方法没有返回值,来自: 如果lambda的主体是语句表达式(即 表达式,它是 与空隙产生函数类型兼容任何结果都是简单的 丢弃。 方法引用也是如此 那样更灵活。假设在您正常调用方法时不使用返回值是一个编译器错误——这会令人非常恼火。在某些情况下,你不得不使用你不在乎的假变量 public class SomeClass{
consumerc=SomeClass::someFunction代码>
不会产生编译错误,因为函数someFunction是一个具有返回值的方法,而使用者表示的方法没有返回值,来自:
如果lambda的主体是语句表达式(即
表达式,它是
与空隙产生函数类型兼容任何结果都是简单的
丢弃。
方法引用也是如此
那样更灵活。假设在您正常调用方法时不使用返回值是一个编译器错误——这会令人非常恼火。在某些情况下,你不得不使用你不在乎的假变量
public class SomeClass{
public static int someFunction(int a) {
return a;
}
public static void main(String[] args) {
Consumer<Integer> c = SomeClass::someFunction;
}
}
如果您想了解可接受内容的完整正式定义,请参阅。这称为特殊无效兼容性规则。例如,您有多少次真正关心List#add
返回类型?即使它确实返回true/false
与此类似,您可以调用一个方法,但忽略其结果。如果将消费者重新编写为lambda表达式,则更有意义:
public class SomeClass
{
public static int someFunction(int a) {
return a;
}
public static void main(String[] args) {
someFunction(3); // "error" - ignoring return type
int unused = someFunction(3); // "success"
}
}
您可以将SomeClass::someFunction
用作使用者。它将愉快地使用一个整数。您将无法捕获返回值。为什么它应该是编译错误?这就像你可以调用一个带值的方法作为一个语句而忽略返回值一样。(有一些方法(如List.add()
)许多人甚至没有意识到会返回值;如果你不能将List::add
转换为消费者
,那将非常恼人。)
Consumer<Integer> c = x -> {
SomeClass.someFunction(x);
return;
}
increment/decrement operations
method invocation
assignment
instance creation