繁体   English   中英

如何使用界限表示协变类型参数

[英]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全部了解是StringR ,而不是RString 如果RAny那么您将无法完成自己想做的事情。

在相反的示例中, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM