java 8 可以传方法么_java-8-将“传递引用”传递给与抽象方法的...

我一直在使用Java 8功能接口,当我开始执行以下代码时,我注意到一些不寻常的东西.

interface Carnivore{

default int calories( List food)

{

System.out.println("=======line ABC ");

return food.size() * 100;

}

int eat(List foods);

}

class Tiger implements Carnivore{

public int eat(List foods)

{

System.out.println("eating "+ foods);

return foods.size();

}

}

public class TestClass {

public static int size(List names){

System.out.println("======line XYZ ");

return names.size()*2;

}

public static void process(List names, Carnivore c){

c.eat(names);

}

public static void main(String[] args) {

List 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>名称,Carnivore c)采用对象类型Carnivore.方法调用process(fnames,TestClass :: size)有效,并且没有编译时错误,这怎么可能?我无法理解此方法调用在内部如何工作.我期待一个错误,因为TestClass不是Carnivore.

我发现的最佳答案是:“您可以显式传递Carnivore实例,也可以传递对与Carnivore抽象方法eat(List< String> foods)的参数列表相匹配的方法的引用”

该部分传递对与抽象方法的参数列表匹配的方法的引用,这使我感到困惑.

如果专家帮助我理解进程(fnames,TestClass :: size)会发生什么,将不胜感激.叫做.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值