为什么Scala不允许在不使用“new”运算符的情况下实例化类?

时间:2015-12-14 09:31:14

标签: scala

我知道我们不能通过在伴侣对象上自己定义一个apply()方法来获得这种效果,但出于所有目的,我最终在Scala代码库中看到的唯一事情就是每个人都会定义apply( )每个类的方法,从而导致很多样板代码。

例如,F#将允许默认情况下没有new的对象实例化(除了一次性用品)。

这个决定有什么理由吗?

1 个答案:

答案 0 :(得分:6)

这已经讨论了scala-language mailing list

Martin Odersky指出:

  

遗漏new的一个问题是匿名课程出现歧义:而不是

new Foo(x) { def y = x + x }
     

你得到:

Foo(x) { def y = x + x }
     

解析器会拒绝这个,因为它认为大括号{...}包含一个函数参数,   所以不允许定义。

我还要补充说,你会遇到无参数构造函数的问题。像

class Foo

你如何实例化这个,特别是如果有一个伴侣对象?当然,可以将这些案例new保留为可选关键字。

更理论的反思是,在class Foo中,Foo是一种类型而不是一种价值。通常,您无法调用某种类型的任何方法,例如合成apply()或假设的.new()。对于案例类apply是在伴随对象上定义的,是值。然后向任何类添加合成apply意味着您总是为任何类获得(合成)伴随对象。

取消new是不可能的。在实验性的Scala-Virtualized项目中do have a virtual new。对于同样的美学问题,人们可以放弃ifwhile等。