class LambdaTest {
public static void main(String[] args) {
Consumer<String> lambda1 = s -> {};
Function<String, String> lambda2 = s -> s;
Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work!
Function<String, String> lambda4 = LambdaTest::consume;
}
static String consume(String s) { return s;}
}
有人能给我解释一下这里发生了什么吗?
正如Brian Goetz在一篇评论中指出的那样,设计决策的基础是允许以调用方法的相同方式使方法适应函数接口,即可以调用每个值返回方法而忽略返回的值。
当谈到lambda表达式时,事情变得更加复杂。lambda表达式有两种形式:(args)->expression
和(args)->{statements*}
。
第二种形式是否与void
兼容取决于是否没有代码路径尝试返回值,例如()->{return“”;}
不与void
兼容,而是与表达式兼容,而()->{}
或()->{return;}
与void
兼容。请注意,()->{for(;;);}
和()->{throw new RuntimeException();}
都是void
兼容和值兼容的,因为它们通常不会完成,而且没有return
语句。
问题内容: 我正在玩Go,发现一个我无法解决的问题。假设我有如下代码: 我导入了软件包并开始使用它: 我真的很喜欢我的助手“运行”,但是我想使其更加慷慨:我不希望人们总是向我传递MySQL客户端。可以是具有“ RunQuery”和“ Result”方法的任何东西。所以我尝试使用接口: 可悲的是,这不再编译了。我收到此错误: Go不支持此功能吗,或者我做错了什么? 问题答案: 应该返回接口,否则你总
好吧,乖点。 这里有一个枚举,它实现了一个接口,该接口返回一个“原始类型”,它给我一个关于接口中的方法的警告。 如果我将接口的方法更改为: 它会在的方法签名上变为未经检查的警告。如果我改变的签名: 然后返回有一个不兼容的类型错误,因为
完整代码如下所示: 在以下部分中 如果返回类型为ostream,则会显示一条红线。我不确定返回类型与ostream有什么区别 *作为参考,我忘了返回操作系统,所以我编辑了这篇文章
我已经为使用者接口尝试了类似这样的lambda表达式,它没有问题。其他一些lambda表达式不起作用,因为它们返回一些东西,如。 编译和执行没有问题。 所以我遇到的问题是,我认为像这样的lambda表达式总是等效于,所以我希望编译器会给我一个错误,因为您不能从使用者接口返回(或任何其他类型)。显然,编译器正在将lambda表达式转换为一个方法,如果没有return语句,并且调用方法而不实际返回值。
问题内容: 我偶然发现了对Java继承的好奇心,我希望您对此提出更好的想法: 假设两个接口A和A1 接口A1扩展了A 接口A具有返回泛型类型的方法。 通用类型将是。 现在的基本思想是将这种通用返回类型从接口A中更改 为 接口A1中的 一开始似乎很容易(不好的事情会在以后出现) 我们将接口A声明为 和接口A1一样 如您所见,我们被迫编写接口A本身,以允许使用基于泛型的“子类”覆盖它。(实际上,gen
问题内容: 考虑以下示例(OOP书籍中的典型示例): 我有一Animal堂课,每个人Animal可以有很多朋友。 和子类喜欢Dog,Duck,Mouse等里面加如特定行为bark(),quack()等等。 这是Animal课程: 这是一些带有大量类型转换的代码片段: 有什么办法可以将泛型用于返回类型来摆脱类型转换,所以我可以说 这是一些带有返回类型的初始代码,这些代码作为从未使用过的参数传递给该方