以下是可以轻松实现的原始特性,没有任何问题:
trait ZPar[-KNV,+KV] {
def get(i: KNV):List[KV]
}现在,我正在尝试使用界来模拟变化(类似于dotty所做的)。
trait ZPar[KNV,KV] {
def get[R >: KNV](i: R):List[_<:KV]
}目前看来还不错。直到我试图实现它:
object ZParImp extends ZPar[String,Int]{
override def get(i: String):List[_<:Int] = {
val v:String = i
List(5)
}
}
//ERROR: method get overrides nothing方法get不能像这样被覆盖。
有任何方法来覆盖方法get吗?
发布于 2018-10-11 08:53:03
我不认为你能做你想做的事。关于R >: String,你所知道的就是String是一个R,而不是R是一个String。如果R是Any,您就不会期望能够做您想做的事情。
在相反的例子中,R是由实例而不是方法固定的。因此,这种方法实现了同样的目的:
trait ZPar[KNV, KV] {
type R >: KNV
def get(i: R): List[_ <: KV]
}
object ZParImp extends ZPar[String,Int] {
type R = String
override def get(i: R): List[_ <: Int] = {
val v: String = i
List(5)
}
}但是很明显,这种方法有它的缺点,而且可能不是你想要达到的目标。
发布于 2018-10-11 07:39:02
如果我们提供一个类型参数,并模仿原来的,它似乎是有效的。
object ZParImp extends ZPar[String,Int]{
override def get[S >: String](i: S):List[_<:Int] = {
val v :S = "blah" // <--it's a String
List(5)
}
}https://stackoverflow.com/questions/52754366
复制相似问题