假设我们有以下类:
public class NameCreator {
public String createName(String lastname) {
return lastname;
}
public String createName(String lastname, String firstName) {
return lastname + " " + firstname
}
...
}
如果我想通过 Java 8 方法引用调用它:
NameCreator::createName
我会得到错误:
Cannot resolve method createName
如何定义要调用哪些方法?
最佳答案
NameCreator::createName
暗示该方法是静态的(下表中的类型#1),或者功能接口(interface)目标也采用类的实例(类型#3,例如
BiFunction<NameCreator, String, String>
)。您的方法不是静态的,因此您的目标可能不会采用实例,这就是您收到“无法解析方法”错误的原因。您可能希望在实例(类型 #2)上使用方法引用。在类里面,您可以使用:
Function<String, String> func = this::createName
在课外你可以使用:
NameCreator creator = new NameCreator();
Function<String, String> func = creator::createName;
至于是使用单参数还是双参数版本,这取决于所针对的功能接口(interface)。以上将使用您的第一种方法,因为 Function<String, String>
接受一个字符串并返回一个字符串。例如,以下功能接口(interface)将使用您的第二种方法:
NameCreator creator = new NameCreator();
BiFunction<String, String, String> func = creator::createName;
参见: Function
, BiFunction
,和整个 java.util.function
package
您可能还对 the Java tutorial on method references 感兴趣,特别是这部分:
方法引用有四种:
Kind | Example
==============================================================================================
Reference to a static method | ContainingClass::staticMethodName
-------------------------------------------------------+--------------------------------------
Reference to an instance method of a particular object | containingObject::instanceMethodName
-------------------------------------------------------+--------------------------------------
Reference to an instance method of an arbitrary object | ContainingType::methodName
of a particular type |
-------------------------------------------------------+--------------------------------------
Reference to a constructor | ClassName::new
==============================================================================================
关于Java 8 方法引用 : how to determine which method to take?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51322724/