所以,这里有一个人为的例子:
trait MyTrait {
type T <: MyTrait
val listOfT:List[T]
def getFirst:T
//def getOne:T = if( listOfT.length > 0 ) { getFirst } else { this }
}
class MyClass extends MyTrait {
type T = MyClass
override val listOfT:List[T] = List[MyClass](this)
override def getFirst:T = listOfT.head
}
这个问题有两个部分:
有没有其他方法可以做到这一点,即MyClass中的返回类型可以是"MyClass",而不必指定"typeT=MyClass"?基本上,我希望能够将这个特性添加到类中,而不必让子类显著地更改其实现或考虑类型系统。。。只返回其自身的成员,并让特性接受任何东西,只要它在子类型上是协变的。这有道理吗?
在MyTrait中,如果取消注释,getOne方法将给出错误"type mismatch:"已找到:MyTrait.this.type(具有基础类型MyTrait)必填项:MyTraitthis.T
如果我将返回类型更改为this.type,我会得到相反的发现/需要的类型不匹配。两个返回值实际上都具有相同的类型(并且实际上是相同的对象)。
处理这些情况的正确方法是什么?
这就是您想要的吗?
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
}
它去掉了type T = MyClass
(允许您将MyClass
放在返回类型中),并修复了getOne
定义中的编译错误。