首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用界表示逆变类型参数

如何使用界表示逆变类型参数
EN

Stack Overflow用户
提问于 2018-10-11 07:15:37
回答 2查看 51关注 0票数 2

以下是可以轻松实现的原始特性,没有任何问题:

代码语言:javascript
复制
trait ZPar[-KNV,+KV] {
  def get(i: KNV):List[KV]
}

现在,我正在尝试使用界来模拟变化(类似于dotty所做的)。

代码语言:javascript
复制
trait ZPar[KNV,KV] {
   def get[R  >: KNV](i: R):List[_<:KV]
}

目前看来还不错。直到我试图实现它:

代码语言:javascript
复制
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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-11 08:53:03

我不认为你能做你想做的事。关于R >: String,你所知道的就是String是一个R,而不是R是一个String。如果RAny,您就不会期望能够做您想做的事情。

在相反的例子中,R是由实例而不是方法固定的。因此,这种方法实现了同样的目的:

代码语言:javascript
复制
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)
  }

}

但是很明显,这种方法有它的缺点,而且可能不是你想要达到的目标。

票数 2
EN

Stack Overflow用户

发布于 2018-10-11 07:39:02

如果我们提供一个类型参数,并模仿原来的,它似乎是有效的。

代码语言:javascript
复制
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)
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52754366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档