scala - 使用泛型强制 Scala 特征的类型

标签 scala generics traits

本质上,我正在尝试执行以下操作:

trait Foo[T] extends T {
  def json: Writes[T]
  def bar: String = {
    Json.toJson[T](this)(json).toString
  }
}

我希望编译器强制任何使用特征 Foo 的类都属于 T 类型。不幸的是,'extends T' 无效。现在,我能做的最好的是:

trait Foo[T] extends T {
  def json: Writes[T]
  def bar: String = {
    Json.toJson(this.asInstanceOf[T])(json).toString
  }
}

但显然,编译器并没有强制执行任何操作。有没有办法实现我想要的?

最佳答案

您可以使用 self type要求任何扩展 Foo[T] 的类也是 T 的实例:

import play.api.libs.json._

trait Foo[T] { self: T =>
  def json: Writes[T]
  def bar: String = Json.toJson[T](self)(json).toString
}

您可以使用任何您想要的名称来代替 self(这只是一个通用约定)。

关于scala - 使用泛型强制 Scala 特征的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32702311/

相关文章:

scala - 为什么异常不会停止 Akka Stream 流

json - 如何解决此Scala/Play编译错误(返回错误的类型)?

scala - scala 中的二维尾递归

c# - 泛型——我可以基于变量编写 T 吗?

rust - 在 Rust 中使用 Trait 的泛型类型不匹配

mysql - 表情符号插入 Play Framework

Java 泛型 - 类型删除后的方法

.net - 泛型方法的返回类型

php - 如何获取内部带有命名空间的特征名称?

java - 如何从 Java 调用具体的 Scala 特征方法?