Scala,扩展具有通用特征的对象

Posted

技术标签:

【中文标题】Scala,扩展具有通用特征的对象【英文标题】:Scala, Extend object with a generic trait 【发布时间】:2012-12-11 00:22:19 【问题描述】:

我正在使用 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)
// ...

我怎样才能让它工作?或者我的错误是什么?

【问题讨论】:

【参考方案1】:

问题是您在 addget 方法上使用 T 隐藏了 trait 的类型参数。有关该问题的更多详细信息,请参阅我的回答 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 将内部所有对象分解为函数,这导致了这个阴影问题! @Themerius:我不确定我是否完全理解你的意思,但问题实际上很简单——你可以在方法的类型参数列表中引入一个新的类型名称,它的拼写与现有的相同在方法之外键入名称。你可以在 Java 中做同样的事情。 当然,这是一个范围的事情。因此,它更像是一个功能。 :)

以上是关于Scala,扩展具有通用特征的对象的主要内容,如果未能解决你的问题,请参考以下文章

Scala 中具有自定义表示的 ADT 的通用派生

Scala - 为使用数据库连接扩展特征/类的对象/单例编写单元测试

具有通用特征的结构,这也是通用特征

Scala's Play 中具有多个案例类(总和类型)的特征的 Json 序列化

当后者具有隐式参数时,如何正确地将特征绑定到其 impl

Scala:如何通过函数对象参数实现签名不同的通用流程?