Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不兼容类型:对象不是功能接口netbeans-11 java_Java_Netbeans_Java 8_Functional Interface_Netbeans 11 - Fatal编程技术网

不兼容类型:对象不是功能接口netbeans-11 java

不兼容类型:对象不是功能接口netbeans-11 java,java,netbeans,java-8,functional-interface,netbeans-11,Java,Netbeans,Java 8,Functional Interface,Netbeans 11,我对Java8的lambda表达式很陌生 我尝试了以下操作,但发现编译错误 class Test{ static interface MySupplier { Object supply(); } public static void main(String[] args) { Object v = value(); if (v instanceof MySupplier) { v = ((MyS

我对Java8的lambda表达式很陌生

我尝试了以下操作,但发现编译错误

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表达式作为普通对象。我想做一些事情,比如

    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表达式的目标类型。 因此,欧内斯特?克的答案可能会有所改进

return (MySupplier) () -> "this line will work";

不能像那样直接返回lambda表达式。这是因为lambda表达式的目标类型必须是函数接口

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

Object supplier = () -> "this line will get COMPILE-ERROR. -> ?????????"; //NO
这是因为目标类型(
对象
)不是功能接口。这与不允许这样做的原因相同

static Object value() {
    return () -> "this line will get COMPILE-ERROR. -> ?????????"; //No
}
如果你真的想做你想做的事情,这是你应该避免的事情,你可以间接地做:

static Object value() {
    MySupplier mySupplier = () -> "this line will get COMPILE-ERROR. -> ?????????";
    return mySupplier;
}

但是您不需要这样做,并且使用
MySupplier
作为返回类型可以使代码干净。

为什么不在
value()中返回
MySupplier
而不是返回
Object
method?这只是一个测试代码。有时我想返回字符串、整数或对象之类的值,有时我想返回一个函数作为Lambda来表示较短的代码。因此我将其作为返回类型的对象。但遗憾的是Lambda没有被编译。将
静态对象值()
更改为
静态MySupplier值()
将起作用我想做的是将functional interface用作其他对象。正如我在代码中所评论的,使用内部类将得到编译,但lambda表达式将不会得到编译。@harunaga我假设您不能这样做。对象是Java中的OOP基本结构,而lambdas(或者,换句话说,函数接口的实例)是函数式编程结构。如果您当前的体系结构使您试图使用lambda作为OOP对象,那么您很可能应该重新设计Ank you man。它确实起到了作用。另外,仅仅为了让编译器工作,再编写一行代码也不是很舒服。:DYeah。但是
(…)->…
构造在很大程度上取决于您将其分配给什么、返回它作为什么或生成它的参数;在所有这些情况下,它必须是一个函数接口。至于您的代码,如果您的返回类型是
MySupplier
,肯定会更好。我现在有点理解了。非常感谢。再编写一行代码是b比“你不能。。。或者这是不可能的