![](/img/trans.png)
[英]How to workaround using a covariant type parameter in a contravariant position
[英]How to represent contravariant type parameter using bounds
这是原始特征,可以轻松实现而没有任何问题:
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
方法吗?
如果我们提供一个模仿原始参数的类型参数,它似乎可以工作。
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)
}
}
我认为您无法完全按照自己的意愿做。 您对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)
}
}
但是显然,这种方法有其缺点,并且可能不是您想要实现的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.