java-8 - 将“传递引用”传递给与抽象方法的参数列表匹配的方法时,java 8 如何在内部进行评估?
问题描述
我一直在使用 java 8 功能接口,当我开始执行下面的代码时,我注意到一些不寻常的东西。
interface Carnivore{
default int calories( List<String> food)
{
System.out.println("=======line ABC ");
return food.size() * 100;
}
int eat(List<String> foods);
}
class Tiger implements Carnivore{
public int eat(List<String> foods)
{
System.out.println("eating "+ foods);
return foods.size();
}
}
public class TestClass {
public static int size(List<String> names){
System.out.println("======line XYZ ");
return names.size()*2;
}
public static void process(List<String> names, Carnivore c){
c.eat(names);
}
public static void main(String[] args) {
List<String> fnames = Arrays.asList("a", "b", "c");
Tiger t = new Tiger();
process(fnames, t::eat);
process(fnames, t::calories);
process(fnames, TestClass::size ); // ----> this is where I am confused.
}
}
如您所见,静态方法process(List<String> names, Carnivore c)
采用对象类型Carnivore
。方法调用process(fnames, TestClass::size )
有效,并且没有编译时错误,这怎么可能?我无法理解这个方法调用在内部是如何工作的。我期待一个错误,因为TestClass
is not Carnivore
。
我找到的最佳答案:“您可以Carnivore
显式传递实例,也可以传递对与 Carnivore 抽象方法的参数列表匹配的方法的引用eat(List<String> foods)
”
这部分pass a reference to a method that matches the parameter list of abstract method
让我很困惑。
如果专家帮助我了解process(fnames, TestClass::size );
被调用时会发生什么,我们将不胜感激。
解决方案
Carnivore
是具有单个抽象方法的功能接口int eat(List<String> foods);
。
因此,任何符合方法签名的eat
方法都可以用来实现接口。
public static int size(List<String> names)
就是这样一种方法,因为它接受一个List<String>
参数并返回一个int
. 因此TestClass::size
可以作为 type 的参数传递Carnivore
,这就是process(fnames, TestClass::size);
通过编译的原因。
顺便说一句,Tiger
不必实现Carnivore
接口process(fnames, t::eat);
即可通过编译,因为该public int eat(List<String> foods)
方法还匹配功能接口的单个抽象方法的签名。
推荐阅读
- c# - 二维阵列馈电
- javascript - 方形按钮中的中心图像
- android - 未找到 Androidx SeekBarPreference xml 属性 setMax
- python-3.x - 如何在不下载的情况下在 AWS S3 中列出 tar 中的文件?
- docker - Docker卷备份错误:Tar:MYCONTAINER_VOLUME:无法统计:没有这样的文件或目录
- php - 如何处理带有 laravel 请求的数组?
- swift - Swift 中的 &<< 和 << 运算符有什么区别?
- python - 机器学习使用数据库标签来理解记录是关于什么的
- php - 如何将开发好的laravel项目部署到远程服务器成为内网应用?
- node.js - 将参数传递给 node.js package.json bin 命令或调试 bin 命令?