首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不兼容类型:对象不是函数接口netbeans-11 java。

不兼容类型:对象不是函数接口netbeans-11 java。
EN

Stack Overflow用户
提问于 2020-01-06 09:35:05
回答 1查看 13.8K关注 0票数 2

我对Java 8的lambda表达式非常陌生

我尝试了以下操作并获得了编译错误

代码语言:javascript
运行
复制
class Test{
    static interface MySupplier {

        Object supply();
    }

    public static void main(String[] args) {
        Object v = value();
        if (v instanceof MySupplier) {
            v = ((MySupplier) v).supply();
        }
        System.out.println(v);
    }

    static Object value() {
//        return () -> "this line will NOT get compiled."; //Error: incompatible types: Object is not a functional interface ???
//        return (Object)(() -> "this line will NOT get compiled, too."); //Error: incompatible types: Object is not a functional interface ???
        return new MySupplier() {

            public Object supply() {
                return "using inner class will work but lambda expression it not";
            }
        };

    }
}

我的问题是“是否可以使用lambda表达式作为普通对象。

代码语言:javascript
运行
复制
    static Object value(Object v) {
        if (v instanceof MySupplier) {
            return ((MySupplier) v).supply();
        }
        return v;
    }

    public static void main(String[] args) {
//        if some case
        Object v1 = value("value 1");
        // else if some other case
        Object v1 = value(() -> { 
            //do some stuff
            return "value 2";
        });
    }

我做了很多搜索,但没有运气。有什么解决办法吗?提前谢谢!

更新:在对lambda表达式有了更好的理解之后,问题是如何让编译器知道要编译到的lambda表达式的目标类型。因此,ernest_k的答案可以改进为

代码语言:javascript
运行
复制
return (MySupplier) () -> "this line will work";
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-06 09:58:07

您不能这样直接返回lambda表达式。这是因为lambda表达式的目标类型必须是一个功能接口。

当前正在方法的return语句上下文中创建lambda表达式,这意味着lambda表达式的类型是该方法的返回类型。这是不允许的:

代码语言:javascript
运行
复制
Object supplier = () -> "this line will get COMPILE-ERROR. -> ?????????"; //NO

这是因为目标类型(Object)不是一个功能接口。因为同样的原因这是不允许的

代码语言:javascript
运行
复制
static Object value() {
    return () -> "this line will get COMPILE-ERROR. -> ?????????"; //No
}

如果你真的想做你想做的事情,这是你应该避免的事情,你可以间接地去做:

代码语言:javascript
运行
复制
static Object value() {
    MySupplier mySupplier = () -> "this line will get COMPILE-ERROR. -> ?????????";
    return mySupplier;
}

但是您不需要这样做,使用MySupplier作为返回类型可以使这段代码变得清晰。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59609671

复制
相关文章

相似问题

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