|
1
68
这与
由于lambda表达式和方法引用是在Java 8中引入的,所以它们没有独立的类型——它们需要 目标类型 ,它必须是功能接口。 如果您尝试:
您还将得到一个类型错误,因为编译器不知道要将lambda转换为哪个函数接口。
要求推断
请注意,您可以通过其他方式(如cast)提供目标类型,然后它就会工作:
因为现在RHS有一个独立的类型。但是您最好通过提供
|
|
|
2
62
从 Local-Variable Type Inference JEP :
由于lambda表达式本身没有类型,因此无法为
当然,您可以想出一种绕过此限制的方法。为什么开发商决定不这样做,这真的取决于猜测,除非参与决策的人可以在这里回答。(更新:已回答 here .)如果您有兴趣,可以在openjdk邮件列表中询问: http://mail.openjdk.java.net/mailman/listinfo
如果让我猜的话,他们可能不想把lambda推断与
|
|
3
33
对于所有认为这是不可能的、不需要的或不需要的人,我只想指出,Scala可以通过只指定参数类型来推断lambda的类型:
在哈斯克尔,因为
这非常方便,因为对于程序员来说,显式指定并不是简单的类型,而是更复杂的类型。 换句话说,它不是Java 10中的一个特性。这是对其实现和以前设计选择的限制。 |
|
4
5
正如一些人已经提到的,应该是什么类型的
声明:
是不明确的,并且编译器没有合理的理由选择
另一个原因是lambda本身没有 可说出的 类型,因此编译器无法推断它。
而且
“如果可能的话”
设想一下开销,因为编译器每次将lambda分配给
|
|
|
5
5
要回答这个问题,我们必须深入了解lambda是什么以及它是如何工作的。 首先,我们应该了解lambda是什么:
lambda表达式始终实现一个函数接口,因此当您必须提供如下函数接口时
考虑到这一点,让我们更进一步:
这非常适合Runnable,我可以创建这样的新线程
然而,在将lambda分配给局部变量的情况下,编译器不知道这个lambda实现的是什么函数接口,因此无法推断出什么类型
这就是为什么lambda不使用var关键字的原因。 |
|
|
6
2
因为这是一个非功能:
|
|
|
7
0
简而言之,var和lambda表达式的类型都需要推断,但方式相反。变量的类型由初始值设定项推断:
lambda表达式的类型由上下文设置。上下文所期望的类型称为目标类型,通常由声明推断,例如。
因此,当var和lambda表达式一起使用时,前者的类型需要由后者推断,而后者的类型需要由前者推断。
这种困境的根源是Java无法唯一地决定lambda表达式的类型,这进一步是由Java的名义类型系统而非结构类型系统造成的。也就是说,结构相同但名称不同的两种类型不被视为相同,例如。
|
|
|
user29759326 · 如何返回递归函数中的最后一个值? 1 年前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 1 年前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 1 年前 |
|
|
rudraraj · java中未声明最终变量 1 年前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 1 年前 |