gpt4 book ai didi

java - 在Scala中,为什么我可以在这里使用 `Unit`作为返回类型?

转载 作者:行者123 更新时间:2023-12-03 00:25:00 24 4
gpt4 key购买 nike

代码如下:

scala> def f(x:Int => Unit):Unit = 1
<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
def f(x:Int => Unit):Unit = 1
^
f: (x: Int => Unit)Unit

scala> f(_=>2);
<console>:9: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
f(_=>2);
^

scala> f(_=>List(1,2));

上面的三个表达式都可以在 REPL 中运行(带有一些警告),但它们看起来有点令人困惑..

在第一个表达式中,f的返回类型是Unit,它是AnyVal的子类型,但不是的父类(super class)型>Int,因此,我无法理解为什么可以使用1作为返回值。

在第二个表达式中,_=>2也使用了2而不是Unit作为返回值,这与定义冲突。

在第三个表达式中,_=> List(1,2)甚至使用List(AnyRef的子类型)作为返回值,但 REPL 仍然没有提示这一点..

有人知道为什么 Unit 可以容忍这里的非子类型类型转换吗?谢谢!

最佳答案

在这种情况下,Scala 将自动插入 () (单例 Unit 值)以使类型检查起作用。所以你所拥有的相当于:

def f(x:Int => Unit):Unit = { 1; () }

这在 Scala 中称为“值丢弃”。来自 spec :

Value Discarding

If e has some value type and the expected type is Unit, e is converted to the expected type by embedding it in the term { e; () }

与许多编程语言一样,这旨在方便“丢弃”表达式的返回值。这允许您创建一个仅使用表达式副作用的 Unit 类型的方法。

关于java - 在Scala中,为什么我可以在这里使用 `Unit`作为返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28564324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com