首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >此表达式的目标类型必须是函数接口-Java 8函数接口

此表达式的目标类型必须是函数接口-Java 8函数接口
EN

Stack Overflow用户
提问于 2017-04-01 04:15:20
回答 2查看 4.6K关注 0票数 2

我只是对lambdas.I有一个小小的疑问,我用下面的code.If得到了下面的错误,我调用了一个返回布尔值或其他类型的方法,我看不出这个issue.How --我能解决这个问题吗?

错误:

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

代码语言:javascript
复制
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!!!");
    }    
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-01 04:30:15

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

试一试:

代码语言:javascript
复制
listofBeans.forEach(MethodReference::call);
public static void call(MockClass bean){...}

代码语言:javascript
复制
listofBeans.forEach(bean -> call());
票数 2
EN

Stack Overflow用户

发布于 2017-04-01 06:18:08

JLS描述了方法引用表达式:

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

因此,您必须将其赋值/转换为函数接口。

代码语言:javascript
复制
listofBeans.forEach(bean-> ((Runnable)MethodReference::call).run());

相当于:

代码语言:javascript
复制
listofBeans.forEach(bean-> call());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43152763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档