Java 8 java 8在传递时如何进行内部计算;传递一个引用;到与抽象方法的参数列表匹配的方法?

Java 8 java 8在传递时如何进行内部计算;传递一个引用;到与抽象方法的参数列表匹配的方法?,java-8,functional-interface,Java 8,Functional Interface,我一直在使用Java8函数接口,当我开始执行下面的代码时,我注意到了一些不寻常的事情 interface Carnivore{ default int calories( List<String> food) { System.out.println("=======line ABC "); return food.size() * 100; } int eat(List<String> foods); } class Tig

我一直在使用Java8函数接口,当我开始执行下面的代码时,我注意到了一些不寻常的事情

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.  
  }
}
界面食肉动物{ 默认整数卡路里(列出食物) { System.out.println(“==========行ABC”); 返回食物。大小()*100; } int eat(列出食物); } 虎类食肉动物{ 公共饮食(列出食物) { System.out.println(“吃”+食物); 返回食物。大小(); } } 公共类TestClass{ 公共静态整型大小(列表名称){ System.out.println(“==========行XYZ”); 返回name.size()*2; } 公共静态无效过程(列表名称,食肉动物c){ c、 吃(名字); } 公共静态void main(字符串[]args){ List fnames=Arrays.asList(“a”、“b”、“c”); 老虎t=新老虎(); 过程(fnames,t::eat); 过程(fnames,t::卡路里); 进程(fnames,TestClass::size);//----->这就是我感到困惑的地方。 } } 如您所见,静态方法
进程(列表名称,Carnivore c)
采用对象类型
Carnivore
。方法调用
process(fnames,TestClass::size)
有效,并且没有编译时错误,这怎么可能呢?我无法理解这个方法调用在内部是如何工作的。我期待出现错误,因为
TestClass
不是
Carnivore

我找到的最佳答案是:“您可以显式地传递一个
Carnivore
实例,也可以传递一个方法引用,该方法与Carnivore的抽象方法
eat(list foods)
的参数列表相匹配。”

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


如果专家能帮助我理解
过程(fnames,TestClass::size)时会发生什么,我将不胜感激
被调用。

肉食动物
是一个功能接口,具有单个抽象方法
int eat(列出食物)

因此,任何符合
eat
方法签名的方法都可以用来实现接口

publicstaticintsize(List name)
就是这样一种方法,因为它接受
List
参数并返回
int
。因此,
TestClass::size
可以作为类型为
Carnivore
的参数传递,这就是为什么
过程(fnames,TestClass::size)通过编译

顺便说一句,
Tiger
不必为
过程实现
Carnivore
接口(fnames,t::eat)
通过编译,因为
public int eat(List foods)
方法也与函数接口的单一抽象方法的签名相匹配。

过程(fnames,t::carries)
如果我不实现
Carnivore
,将不会编译。无论如何,我已经测试了我的代码,看看有没有实现会发生什么。我很感激你的回答。@MKod
process(fnames,t::carries)
如果你的
Tiger
类没有实现
Carnivore
,那么它将不会编译,因为
carries
方法只在接口中定义,所以
Tiger
类如果没有实现接口就没有该方法。