所以,这里有一个人为的例子:
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" 而不必指定 "type T = MyClass" ?基本上我希望能够将这个特性添加到一个类中,而不必让子类显着改变它的实现或考虑类型系统......只返回它自己的成员,并让特性接受任何东西,只要它在子类型上是协变的。这甚至有意义吗?
在 MyTrait 中,如果未注释,getOne 方法将给出错误“type mismatch:” found : MyTrait.this.type (withunderlying type MyTrait) required: MyTrait.this.T
如果我将返回类型更改为 this.type,我会得到相反的发现/所需类型不匹配。任何一个返回值实际上都具有相同的类型(并且实际上是相同的对象)。
处理这些情况的正确方法是什么?