我正在使用Scala,我想用trait扩展一个(单例)对象,它提供了一个数据结构和一些方法,像这样:
trait Tray[T] {
val tray = ListBuffer.empty[T]
def add[T] (t: T) = tray += t
def get[T]: List[T] = tray.toList
}
然后我想把这个特征混合到一个对象中,像这样:
object Test with Tray[Int]
但add
和get
存在类型不匹配:
Test.add(1)
// ...
我怎样才能使它工作?或者我错在哪里?
问题是您在add
和get
方法上使用T
遮蔽了trait的类型参数。关于这个问题的更多细节,请看我的回答。
正确的代码如下:
trait Tray[T] {
val tray = ListBuffer.empty[T]
def add (t: T) = tray += t // add[T] --> add
def get: List[T] = tray.toList // get[T] --> add
}
object Test extends Tray[Int]
注意,在对象定义中使用了extends
——请参阅规范的5.4节,了解为什么单独使用with
在这里不起作用。