2017-03-28 19 views

回答

6

一些函数式编程语言,比如Haskell,可以推断几乎 所有类型的,因为他们可以进行全局类型推断。斯卡拉不能 这样做,部分原因是因为斯卡拉必须支持子类型多态性 (继承),这使得类型推断困难得多。这里有一个 Scala中需要显式类型注释的规则摘要。

时,显式类型注释需要

在实际应用中,你必须为下列情况提供明确的类型注释:

  • 一个可变的VAR或不变VAL声明,你不要指定一个值(例如,像val book这样的类中的抽象声明:String,var count:Int

  • 所有方法参数(例如,def deposit(amount:Money)= {...})。

  • 方法的返回类型在下列情况下:

    1)当你显式调用的方法(甚至在结束返回)。

    2)当一个方法是递归的。

    3)当两个或更多的方法被重载(具有相同的名称)并且其中一个调用另一个时;调用方法需要返回类型注释。

    4)当推断的返回类型比您想要的更通用时,例如Any。

来源Programming Scala, 2nd Edition - O'Reilly Media

+0

谢谢!这有帮助。 –

2

我有一个简单的问题,为什么是Scala编译器不能够通过自身来推断函数参数类型?

斯卡拉有本地类型推断。如果你看看这个方法,并且看看本地有什么信息,那么应该很容易看出,简单地说没有关于这些类型可能的信息

说,你有以下方法:

def foo(a) = a + a 

如何斯卡拉要弄清楚a是什么类型的?它只能从图中看出的方法是如何调用的,但这是非本地的信息!

而且更糟的是:由于Scala支持动态代码加载,所以在编译时调用代码甚至可能不存在

相关问题