首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有通用自我类型的Scala特性

具有通用自我类型的Scala特性
EN

Stack Overflow用户
提问于 2015-12-22 22:09:52
回答 4查看 2.7K关注 0票数 4

我有一个特性,它定义了一个动作,它是.copy()的一个光荣版本。看起来是这样的:

代码语言:javascript
复制
trait Optimize[T] {
    def optimize: T
}

还有一堆扩展它的类,比如:

代码语言:javascript
复制
case class Account(field: String) extends Optimize[Account] {
    def optimize = this.copy(field = field.intern())
}

是否有一种方法可以定义需要优化方法的特性,返回与self相同的类型,但在扩展时不需要指定类型?这样我就能写:

代码语言:javascript
复制
case class Account(field: String) extends Optimize {
    def optimize = this.copy(field = field.intern())
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-23 02:27:44

简短的回答:你不能。

无论如何(抽象类型),您需要告诉Optimize该函数的返回类型是什么。

为什么?因为可以在不指定具体类的情况下在类型表达式中使用Optimize,所以编译器无法知道它将产生什么样的类型:

代码语言:javascript
复制
def someOtherMethod (a: Optimize) {
  val result = a.optimize // what is the type?
}

(对于抽象类型,返回类型为a.TOptimize#T .(不太有用)

票数 2
EN

Stack Overflow用户

发布于 2017-02-18 05:23:30

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

代码语言:javascript
复制
def optimize: this.type = ???
票数 3
EN

Stack Overflow用户

发布于 2015-12-22 23:22:06

如果只希望在扩展时避免指定类型参数,则可以将定义移动到如下所示的类型成员。

代码语言:javascript
复制
trait Optimize {
    type T
    def optimize: T
}

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

但你只是把它从一个地方搬到另一个地方。另外,使用类型参数来参数化特征比让类型成员参与进来要好得多。

这样做的原因是什么?因为对于类型参数来说,用例似乎是完全有效的情况。特性需要通过类型参数或类型成员告诉优化()返回的是什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34425257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档