【发布时间】:2015-02-07 23:04:58
【问题描述】:
我正在开发一个通用的小工具,我需要有这样的东西:
Operator trait,将为操作元素提供工具
一个Publisher trait,负责发布一个在以下示例中由Set() 表示的结果
实现操作特征的类
此类的伴随对象,它将实现发布者操作。我的设计必须将发布的结果与发布操作保持相同的特征
简而言之,我有以下结构:
trait Publisher[A]{
var storage: Set[A] = Set[A]()
def publishOper(elem: A) = storage += elem
}
trait Operator[A, B]{
def operate(elem: A): B = ???
}
object Oper extends Publisher {
}
class Oper[A, B] extends Operator[A, B]{
def publishOper(elem: A): B = {
val res = operate(elem)
publishOper(res)
}
}
但是,你可以想象,我收到以下错误:
publishOper(res):类型不匹配,预期:A,实际:B
这给我提出了几个问题:
扩展伴生对象时类型推断如何工作? (又名:为什么会这样?)
我该如何解决这个问题,同时尝试保持相同的结构?
【问题讨论】:
-
class Oper[A, B] extends Operator[A, B] with Publisher[B] { ... -
那行不通,因为任何类实例都有自己的存储,并且发布不会反映在伴随对象中。这就是为什么我提到设计必须让它们保持相同的特征。
-
它们不是同一类型。我认为您应该考虑制作一个单独的对象来实现 Publisher,也许是一个隐式的,并将其传递给每个 Oper 实例。
-
即
class Oper[A,B](implicit publisher: OperPub[B]) extends Operator[A,B] -
这几乎限制了解决方案的可扩展性,我无法承受。案例类别(正如您在回复中显示的那样)非常严格。我需要保留类实现。而且,正如所见,我需要从伴随对象访问存储单元。
标签: scala object types traits inference