Scala - 返回类型参数化对象的类型参数化特征方法 - 如何实现?

标签 scala types implementation type-systems traits

我有以下类层次结构:

trait Entity {
  type E <: Entity
  type S <: Something[E]
  def in: S
}

trait Something[E <: Entity] {
  def doSomething {
    // something
  }
}

class A extends Entity {
  def in = InA
  object InA extends Something[A]
}
class B extends Entity {
  def in = InB
  object InB extends Something[B]
}
class C extends Entity {
  def in = InC
  object InC extends Something[C]
}

还有我想去的其他地方:

val entities = Seq[Entity]
entities.map(_.in.doSomething)

但是,类型系统并没有让我摆脱 in 方法定义 - 我只是想不通我应该在那里指定什么类型才能让这段代码工作?

最佳答案

如果您像这样覆盖类型成员,它就会起作用。 Scala 不会自动推断它们。

class A extends Entity {
  type E = A
  type S = Something[A]
  def in = InA
  object InA extends Something[A]
}
class B extends Entity {
  type E = B
  type S = Something[B]
  def in = InB
  object InB extends Something[B]
}
class C extends Entity {
  type E = C
  type S = Something[C]
  def in = InC
  object InC extends Something[C]
}

另一种选择是取消类型成员,只使用类型参数。

trait Entity[E <: Entity[E]] {
  def in: Something[E]
}

trait Something[E <: Entity[E]] {
  def doSomething {
    // something
  }
}

class A extends Entity[A] {
  def in = InA
  object InA extends Something[A]
}
class B extends Entity[B] {
  def in = InB
  object InB extends Something[B]
}
class C extends Entity[C] {
  def in = InC
  object InC extends Something[C]
}

val entities = Seq[Entity[_]]()
entities.map(_.in.doSomething)

这使用了一种称为 F-bounded polymorphism 的技术.

关于Scala - 返回类型参数化对象的类型参数化特征方法 - 如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14039333/

相关文章:

javascript - 联合类型缺少属性

templates - D 是否允许将接口(interface)与模板中的实现分离?

基于 Java 的简单规则引擎,具有后备功能

scala - Scala 中 Traversable 内容的隐式转换

c# - 显示错误输出的结构的 Marshal.SizeOf

C++, float 到整数类型转换

java - 自动调用已实现的方法?

java - Spark Streaming StreamingContext 错误

scala - 尝试理解 Scala 中树上的 scanLeft

java - 将 Scala 表达式转换为 Java 1.8