gpt4 book ai didi

scala - 试图找到更简单的方法来从特征中引用子类的类型

转载 作者:行者123 更新时间:2023-12-04 00:24:12 27 4
gpt4 key购买 nike

所以,这里有一些人为的例子:

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 方法将给出错误“类型不匹配:” 找到:MyTrait.this.type(具有底层类型 MyTrait) 要求:MyTrait.this.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 定义中的编译错误

关于scala - 试图找到更简单的方法来从特征中引用子类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12273969/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com