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

标签 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 <: java.io.Serialized]。

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

我想,<:语句类似于java的? extends语句,这将解决 Java 中的此类问题。

如何在 Scala 中修复它?

最佳答案

List在2.11.0-M3之前没有扩展Serialized

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

关于scala - 如何在 Scala 中正确声明协变类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25078138/

相关文章:

Kotlin 对 "supposedly"正确类型的类型推断

scala - 两个字符串的叉积

c# - 如何从此代码重构我们的类型参数?

java - 使用 ParameterizedTypeReference 为 HttpRequestExecutingMessageHandler 设置 ExpectedResponseType

java - 实例化泛型类并实现泛型接口(interface)

python - numpy协方差和协方差矩阵通过公式产生不同的结果

java - 我如何将表导入另一个类(/对象??)以便我可以在另一个类/对象中对其运行查询? [圆滑 3.0][scala]

scala - 如何在 Scala 中将文件读取为字节串?

scala - 从LabelledGeneric实例中提取标签值

r - 在 Lavaan 中将协方差设置为零