意外的实例方法函数..在未绑定查找中找到



为什么字段whyIsAnInstanceRequired需要一个实例,并且不会像字段errWhyIsAnInstanceRequired那样工作?

编译错误为:

Error: java: incompatible types: invalid method reference
            unexpected instance method function(programming.java.FunctionalQuestion.Helper,programming.java.FunctionalQuestion) found in unbound lookup

请参阅代码:

public class FunctionalQuestion {
    class Helper { }
    public void setValue (long value) { }
    ObjLongConsumer<FunctionalQuestion> whyIsAnInstanceNotRequired =
        FunctionalQuestion::setValue;
    public void function(Helper helper, FunctionalQuestion functionalQuestion) { }
    BiConsumer<Helper, FunctionalQuestion> whyIsAnInstanceRequired =
        new FunctionalQuestion()::function;
    /*
    * Error: java: incompatible types: invalid method reference
        unexpected instance method function(programming.java.FunctionalQuestion.Helper,programming.java.FunctionalQuestion) found in unbound lookup
    * */
    BiConsumer<Helper, FunctionalQuestion> errWhyIsAnInstanceRequired =
        FunctionalQuestion::function;
}
我相信

这解释了为什么我对原始代码感到惊讶。

这个概念称为:

对特定类型的任意对象的实例方法的引用。

示例:ContainingType::methodName如中所述:方法参考.html

从该文档中:

下面是对特定类型的任意对象的实例方法的引用示例:

String[] stringArray 
       = { "Barbara", "James", "Mary", "John","Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);

方法引用String::compareToIgnoreCase的等效 lambda 表达式将具有形式参数 list (String a, String b) ,其中 a 和 b 是用于更好地描述此示例的任意名称。方法引用将调用方法 a.compareToIgnoreCase(b)

最新更新