我有一个特性,它定义了一个动作,它是.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())
}发布于 2015-12-23 02:27:44
简短的回答:你不能。
无论如何(抽象类型),您需要告诉Optimize该函数的返回类型是什么。
为什么?因为可以在不指定具体类的情况下在类型表达式中使用Optimize,所以编译器无法知道它将产生什么样的类型:
def someOtherMethod (a: Optimize) {
val result = a.optimize // what is the type?
}(对于抽象类型,返回类型为a.T或Optimize#T .(不太有用)
发布于 2017-02-18 05:23:30
您可以使用this.type作为返回值来引用实现者的类型。
def optimize: this.type = ???发布于 2015-12-22 23:22:06
如果只希望在扩展时避免指定类型参数,则可以将定义移动到如下所示的类型成员。
trait Optimize {
type T
def optimize: T
}
case class Account(field: String) extends Optimize {
type T = Account
def optimize = this.copy(field = field.intern())
}但你只是把它从一个地方搬到另一个地方。另外,使用类型参数来参数化特征比让类型成员参与进来要好得多。
这样做的原因是什么?因为对于类型参数来说,用例似乎是完全有效的情况。特性需要通过类型参数或类型成员告诉优化()返回的是什么。
https://stackoverflow.com/questions/34425257
复制相似问题