为什么字段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)
。