我正在使用Scala,我想用特质扩展一个(单例)对象,该特质提供一个数据结构和一些方法,如下所示:

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]

但是addget中存在类型不匹配的内容:
Test.add(1)
// ...

我如何才能使它正常工作?还是我的错?

最佳答案

问题是您在Tadd方法上使用get遮蔽了特征的type参数。有关此问题的更多详细信息,请参见我的答案here

这是正确的代码:

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 -请参见the spec的5.4节,以解释为什么单独使用with不能在此处工作。

关于Scala,使用通用特征扩展对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14023712/

10-12 19:53