System.out.println 功能接口的类型是什么?

is the type of System.out.println functional interface?

有一件事我不明白,方法引用的类型不应该是函数式接口吗?那么我们如何将 System.out::println 作为参数传递给 forEach?在以下代码中:

1-System.out::println 是消费者吗?

2-如果是,它的泛型是什么?我指的不是调用方法的列表类型,而是传递给 forEach 的方法引用的泛型类型。

Consumer<Integer> consumer=System.out::println;
numbers.forEach(consumer); 

System.out.println 的类型不是功能接口,因为 System.out.println 是方法,而不是接口。

但是,方法引用System.out::println 可以用作功能接口的实现。因为 println 接受一个参数而 returns 什么都不接受,你可以说它“消耗”了你传递给它的参数。因此它适合作为 Consumer<T> 功能接口的实现。

请注意 println 有多种变体,可用于实现不同的功能接口。

例如:

  • 引用public void println(int x)的方法可以实现IntConsumer.

  • 引用public void println(double x)的方法可以实现DoubleConsumer.

  • 引用public void println(Object x)的方法可以实现Consumer<T>.

  1. System.out.println 是方法而不是接口
  2. System.out::println 可以被视为接口的一个实现,因为它接受一个参数并且 returns 什么都没有

这部分代码:

Consumer<Integer> consumer=System.out::println;

等于此 lambda 表达式:

Consumer<Integer> consumer=i->System.out.println(i);

及以上代码块可以使用消费者接口以这种方式编写为匿名内部 class:

Consumer<Integer> consumer=new Consumer<Integer>(){
   public void accept(Integer i){
      System.out.println(i);
   }
}

所以“System.out.println”本身不是一个功能接口,但是当你使用::时,你隐式地实现了消费者接口。