我有以下类层次结构:
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/