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]
但是add
和get
存在类型不匹配:
Test.add(1)
// ...
我怎样才能让它工作?或者我的错误是什么?
【问题讨论】:
【参考方案1】:问题是您在 add
和 get
方法上使用 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 - 为使用数据库连接扩展特征/类的对象/单例编写单元测试