Scala特征与通用自我类型

时间:2015-12-22 22:09:52

标签: scala generics

我有一个特征,它定义了一个动作,它是.copy()的美化版本。看起来像这样:

trait Optimize[T] {
    def optimize: T
}

和一堆扩展它的类,如:

case class Account(field: String) extends Optimize[Account] {
    def optimize = this.copy(field = field.intern())
}

有没有办法定义需要方法优化的特征返回与self相同的类型但是在扩展时不需要指定类型?所以我能够写下:

case class Account(field: String) extends Optimize {
    def optimize = this.copy(field = field.intern())
}

3 个答案:

答案 0 :(得分:2)

简短回答:你不能。

需要的某种方式(抽象类型)告诉GROUP BY ... HAVING COUNT(*) > 1该函数的返回类型是什么。

为什么呢?因为Optimize可以在类型表达式中使用而不指定具体类,并且编译器无法知道它将生成什么类型​​:

Optimize

(在抽象类型的情况下,返回类型为def someOtherMethod (a: Optimize) { val result = a.optimize // what is the type? } a.T ......不是很有用)

答案 1 :(得分:1)

如果您只想避免在扩展时指定类型参数,则可以将定义移动到类似的类型成员。

trait Optimize {
    type T
    def optimize: T
}

case class Account(field: String) extends Optimize {
    type T = Account
    def optimize = this.copy(field = field.intern())
}

但是你只是把它从一个地方移到另一个地方。此外,使用类型参数来参数化特征比获取类型成员更好。

这样做的原因是什么?因为您的用例似乎是类型参数的完全有效的情况。需要通过类型参数或类型成员来告诉Trait what()返回的内容。

答案 2 :(得分:0)

您可以使用this.type作为返回值来引用实现者的类型。

def optimize: this.type = ???