我很难理解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的公共类型,从而更易于管理向后兼容性。
我试图理解这里的返回类型注释如何帮助向后兼容的开发。任何人都可以通过具体的代码示例进行演示吗?
谢谢。
实际上非常简单:
如果您明确地注释返回类型,则返回类型将永远是您所说的那样。
如果您不要注释返回类型,则返回类型将被推断为现在右侧的任何类型。
因此,只要右侧的类型发生变化,在第一种情况下,返回类型将保持不变,在第二种情况下,返回类型将发生变化,从而(可能)破坏现有用户。] >
在这种情况下,如上所述,第一个和第二个示例中的返回类型实际上是不同的:
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
。因此,返回类型已更改,这是由于
应该