如何在Scala中正确声明协变类型?

时间:2014-08-01 10:25:15

标签: scala generics covariance

我使用以下签名和方法创建了一个特征(详细信息省略):

trait Cachable[A <: java.io.Serializable] {

   def push(key: String, value: A) = ???

   def pull(key: String): A = ???
}

以下代码无法编译(Document类实现java.io.Serializable,而List实现scala.Serializable扩展java.io.Serializable):

class DocsService extends Cachable[List[Document]] {
   ...
}

错误消息表示如下:Cachable [List [Document]]不符合Cachable类型[A&lt;:java.io.Serializable]。

如果我理解正确,编译器意味着Cachable[scala.Serializable]不是Cachable[java.io.Serializable]的子类型。

我认为,<:语句类似于java的? extends语句,它可以解决Java中的这类问题。

如何在Scala中修复它?

1 个答案:

答案 0 :(得分:4)

List未在2.11.0-M3之前扩展Serializable

https://issues.scala-lang.org/browse/SI-7402