Scala,使用通用特征扩展对象

The*_*ius 7 singleton scala traits extend type-mismatch

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

trait Tray[T] {
  val tray = ListBuffer.empty[T]

  def add[T] (t: T) = tray += t
  def get[T]: List[T] = tray.toList
}
Run Code Online (Sandbox Code Playgroud)

然后我想将特征混合到一个对象中,如下所示:

object Test with Tray[Int]
Run Code Online (Sandbox Code Playgroud)

但是在add和中存在类型不匹配get:

Test.add(1)
// ...
Run Code Online (Sandbox Code Playgroud)

我怎么能让这个工作?或者我的错误是什么?

Tra*_*own 20

问题是你使用Ton addget方法隐藏了特征的类型参数.见我的答案在这里,了解有关问题的更多细节.

这是正确的代码:

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]
Run Code Online (Sandbox Code Playgroud)

请注意extends在对象定义中的使用- 请参阅规范的 5.4节,以解释为什么with单独在此处不起作用.

  • @Themerius:我不确定我到底是什么意思,但问题实际上很简单 - 你可以在方法的类型参数列表中引入一个新的类型名称,该列表的拼写与方法之外的现有类型名称相同.你可以用Java做同样的事情. (2认同)