我有一个特征,它定义了一个动作,它是.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())
}
答案 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 = ???