【问题标题】:The target type of this expression must be a functional interface -Java 8 Functoinal Interface此表达式的目标类型必须是函数式接口 -Java 8 Functoinal Interface
【发布时间】:2017-04-01 04:15:20
【问题描述】:

我只是对 lambdas 有一点疑问。使用以下代码出现以下错误。如果我正在调用返回布尔值或其他类型的方法,我看不到这个问题。我该如何解决这个问题?

错误:

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

在 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!!!");
    }    
}

【问题讨论】:

    标签: java-8 functional-interface


    【解决方案1】:

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

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

    因此您必须将其分配/强制转换为函数接口。

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

    相当于:

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

    【讨论】:

      【解决方案2】:

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

      试试这个:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多