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