如何提供编译时保证我的方法将返回它在Scala中获取的相同对象?

Jea*_*let 5 types scala this path-dependent-type

在Scala类中,我可以方便地声明方法的返回类型,this.type以保证它将返回调用它的同一对象:

class Foo {
  def bar: this.type = this
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以类似地指定接受给定AnyRef参数的方法将完全返回该引用?以下代码段不提供此保证,我可以返回以下任何实例A:

def processAndReturn[A <: AnyRef](obj: A): A = {
  // work with obj
  obj
}
Run Code Online (Sandbox Code Playgroud)

Kip*_*ros 8

huitseeker的建议实际上对-Ydependent-method-types选项有效:

$ scala -Ydependent-method-types
Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).

scala>   def processAndReturn[A <: AnyRef](obj: A): obj.type = {
     |       // work with obj
     |       obj
     |   }
processAndReturn: [A <: AnyRef](obj: A)obj.type

scala> processAndReturn("hi")
res1: java.lang.String = hi
Run Code Online (Sandbox Code Playgroud)

这个线程,我收集实验相关的方法类型已经存在了一段时间,甚至有一篇已发表的论文使用它们,但实现可能是错误的.关于重新编写Scala类型系统基础的讨论已经有了一些讨论(参见Adriaan Moor 关于依赖对象类型的幻灯片).如果它成功了,我想在Scala的未来版本中,依赖方法类型(以及其他内容)将完全犹豫不决.