【发布时间】:2012-09-07 18:01:48
【问题描述】:
好的,所以,我知道我可以做以下事情:
trait MyTrait[T <: MyTrait[T]] { self: T =>
val listOfT: List[T]
def getFirst: T
def getOne: T = if (listOfT.length > 0) getFirst else self
}
class MyClass extends MyTrait[MyClass] {
override val listOfT: List[MyClass] = List[MyClass](this)
override def getFirst: MyClass = listOfT.head
}
如果我希望 MyTrait 有一个伴随对象,它看起来像:
object MyTrait{
def doSomething[T <: MyTrait[T]](aninstance:T)= { ... }
}
所有这些看起来都很丑陋,我希望看到更好的方法,但是,现在我只是想弄清楚,如何从其他任何地方引用类型?例如:
case class Foo( anInstanceOfMyTrait: MyTrait[what goes here???] )
或者有没有更简单的方法?
【问题讨论】:
-
case class Foo[A](i: MyTrait[A])呢? -
好吧,然后案例类编译,但如果我从匹配器中提取
i并尝试将i传递给MyTrait.doSomething[T<:MyTrait[T]](aninstance:T),我会收到错误:“推断类型参数[MyTrait[Any]] 不符合方法 doSomething 的类型参数界限 [T <: mytrait> -
如果我:
case class Foo[A <: MyTrait[A]](i:MyTrait[A])在尝试将i传递给doSomething时,我仍然得到相同的推断类型参数错误 -
基于相同的示例代码添加了另一个类似的问题,其中包含更多问题:stackoverflow.com/questions/12337846/…
标签: scala inheritance types