Function<Integer, String> intToString = Object::toString
上面的代码是方法参考的示例
请帮我解决它的工作原理。
根据我的理解方法,引用应该具有与功能接口抽象方法(R apply(T))相同的方法签名。
基本上,你是对的。为某个声明为的变量赋值
Function<Integer, String> intToString = value;
然后value
必须是一个Function<Integer, String>
,有一个
public String apply(Integer t) { ... }
方法。
棘手的是,像Object::toString
这样的方法参考表达式是语法糖
Function<Integer, String> intToString = new Function<Integer,String>() {
public String apply(Integer t) {
return t.toString();
}
};
它是如何知道Integer
和String
类型参数只是在表达式Object::toString
中没有提到的?这来自作业的左侧。编译器知道期望的函数类型,并从方法引用Function
创建适当的内部匿名Object::toString
实例。
警告:方法参考Object::toString
仅在编译器可以清楚地推断出预期类型的情况下才允许,因为此表达式的类型不清楚。根据上下文(例如左侧),同样的Object::toString
也可以成为Consumer<Point>
而不是Function<Integer, String>
,然后实施void accept(Point t)
方法。