不兼容的类型:对象不是功能接口 netbeans-11 java
incompatible types: Object is not a functional interface netbeans-11 java
我对 Java 8
的 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表达式的目标类型。
所以 ernest_k 的答案可以改进为
return (MySupplier) () -> "this line will work";
你不能像那样直接 return 你的 lambda 表达式。这是因为 lambda 表达式的目标类型必须是函数式接口。
您目前正在方法的 return 语句的上下文中创建 lambda 表达式,这意味着 lambda 表达式的类型是该方法的 return 类型。这是不允许的:
Object supplier = () -> "this line will get COMPILE-ERROR. -> ?????????"; //NO
那是因为目标类型 (Object
) 不是函数式接口。同理不允许这样
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
作为 return 类型可以使这段代码变得干净。
我对 Java 8
的 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表达式的目标类型。 所以 ernest_k 的答案可以改进为
return (MySupplier) () -> "this line will work";
你不能像那样直接 return 你的 lambda 表达式。这是因为 lambda 表达式的目标类型必须是函数式接口。
您目前正在方法的 return 语句的上下文中创建 lambda 表达式,这意味着 lambda 表达式的类型是该方法的 return 类型。这是不允许的:
Object supplier = () -> "this line will get COMPILE-ERROR. -> ?????????"; //NO
那是因为目标类型 (Object
) 不是函数式接口。同理不允许这样
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
作为 return 类型可以使这段代码变得干净。