我在下面定义了一种方法。
def diff(x:Int,y:Int)={ if (x>y) (x+y).toString else x-y }
工作正常。
如果我使用如下的return语句则会抛出错误
def diff(x:Int,y:Int)={if (x>y) return (x+y).toString else return x-y}
结果需要返回类型
当我明确定义类型Any
时,以下代码正常工作。
当我没有明确定义结果类型时,为什么这不会推断为any
?
def diff(x:Int,y:Int):Any={if (x>y) return (x+y).toString else return x-y}
答案 0 :(得分:3)
如果方法中存在返回,则Scala无法知道该点的返回类型(因为它可能会在示例中返回更多)。
因此Scala的编译器必须检查整个方法以寻找更多的退出点(返回)。这将增加编译和推断类型所花费的复杂性和时间。
编译器为避免这种情况而给出的解决方案是,如果存在返回,则强制定义输出类型。
您可以避免退货,并推断出类型:
这里的简单例子
返回没有明确的类型
def myFunc(x: Int) = return x+1
<console>:7: error: method myFunc has return statement; needs result type
def myFunc(x: Int) = return x+1
无法返回,类型已正确推断
scala> def myFunc(x: Int) = x+1
myFunc: (x: Int)Int
以明确的类型返回
scala> def myFunc(x: Int): Int = return x+1
myFunc: (x: Int)Int
答案 1 :(得分:0)
Scala函数不需要显式return
。函数体中的最后一个表达式通常被解释为函数调用的返回值。
重写你的功能:
def diff(x:Int,y:Int): Any = {
if (x>y) (x+y).toString
else scalax-y
}
您的第二个函数会抛出错误,因为您可以从错误消息中清楚地看到,scala对于函数的返回类型是多么困惑(并且理所当然)。您的函数返回String
或Int
,具体取决于条件,因此您需要为scala指定显式类型。
根据此answer
,当类型可以推广到比Any
更具体的内容时,Scala不会推断Any
。