此表达式的目标类型必须是功能接口-Java 8 Functoinal Interface

时间:2017-04-01 04:15:21

标签: java-8 functional-interface

我对lambdas有一点疑问。我用以下代码得到以下错误。如果我正在调用一个返回布尔值或其他类型的方法,我没有看到这个问题。我怎么能解决这个问题?

错误:

  

线程“main”中的异常java.lang.Error:未解决的编译问题:           Iterable类型中的forEach(Consumer)方法不适用于参数((bean) - > {})           此表达式的目标类型必须是功能接口

     

at com.wipro.MethodReference.main(MethodReference.java:18)

package com.sample;

import com.student.MockClass;

import java.util.ArrayList;
import java.util.List;

public class MethodReference {
    public static void main(String[] args) {
        MockClass obj = new MockClass("JSP", 2);
        MockClass obj1 = new MockClass("Java", 8);
        List<MockClass> listofBeans = new ArrayList<MockClass>();
        listofBeans.add(obj);
        listofBeans.add(obj1);
        listofBeans.forEach(bean -> MethodReference::call);
    }

     public static void call(){
        System.out.println("Hii!!!");
    }    
}

2 个答案:

答案 0 :(得分:3)

JLS描述了方法参考表达式:

  

如果T是函数接口类型(第9.8节)且表达式与地面目标类型的函数类型一致,则方法引用表达式在赋值上下文,调用上下文或具有目标类型T的转换上下文中是兼容的源自T。

所以你必须将它/分配/转换为功能界面。

listofBeans.forEach(bean-> ((Runnable)MethodReference::call).run());

相当于:

listofBeans.forEach(bean-> call());

答案 1 :(得分:1)

功能接口(在本例中为c <- temp)的目的是通过流传递数据。您的方法Consumer没有多大意义,因为它不接受任何参数并且不返回任何内容。你可以这样做但不能用方法参考。

请改为尝试:

call()

listofBeans.forEach(MethodReference::call);
public static void call(MockClass bean){...}