返回类型注释如何更改Twitter的有效Scala中的scala mixin行为

问题描述 投票:0回答:1

我很难理解Twitter的有效Scala https://twitter.github.io/effectivescala/中的以下解释:

虽然Scala允许省略这些,但是这些注释提供了很好的文档:这对于公共方法尤其重要。如果某个方法没有公开并且其返回类型很明显,请忽略它们。当使用mixins实例化对象时,这尤其重要,因为scala编译器会为它们创建单例类型。例如,输入:

trait Service
def make() = new Service {
  def getId = 123
}

没有返回类型的服务;编译器使用Service {def getId:Int}创建优化类型Object。而是使用显式注释:

def make(): Service = new Service{} 

现在,作者可以随意混合更多特征,而无需更改make的公共类型,从而更易于管理向后兼容性。

我试图理解这里的返回类型注释如何帮助向后兼容的开发。任何人都可以通过具体的代码示例进行演示吗?

谢谢。

scala mixins
1个回答
0
投票

实际上非常简单:

如果您明确地注释返回类型,则返回类型将永远是您所说的那样。

如果您不要注释返回类型,则返回类型将被推断为现在右侧的任何类型。

因此,只要右侧的类型发生变化,在第一种情况下,返回类型将保持不变,在第二种情况下,返回类型将发生变化,从而(可能)破坏现有用户。] >

在这种情况下,如上所述,第一个和第二个示例中的返回类型实际上是不同的:

def make(): Service = new Service { def getId = 123 }
make()的返回类型为Service

def make() = new Service { def getId = 123 }

make()的返回类型为Object with Service

[如果您现在对方法进行一些小的更改,例如将该方法提取到通用trait

trait IdGetter { def getId = 123 }

并重构代码以使用该特征:

def make(): Service = new Service with IdGetter {}

现在,在这种情况下,返回类型为

still

Service
但是在这种情况下:

def make() = new Service with IdGetter {}

返回类型现在为Object with Service with IdGetter

因此,返回类型已更改,这是由于

应该

是简单的提取方法重构,对于用户完全可见,但实际上破坏了下游依赖性。
© www.soinside.com 2019 - 2024. All rights reserved.