我一直在使用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)会发生什么,将不胜感激.叫做.