【问题标题】:How to declare a covariant type correctly in Scala?如何在 Scala 中正确声明协变类型?
【发布时间】:2014-09-24 12:48:32
【问题描述】:

我创建了一个具有以下签名和方法的特征(细节省略):

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]] does not conform with type Cachable[A <: java.io.serializable>

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

我想,&lt;: 语句类似于 java 的 ? extends 语句,可以解决 Java 中的此类问题。

如何在 Scala 中修复它?

【问题讨论】:

  • 这个特征不能(可靠地)是协变的,因为你既接受 A 又返回 A

标签: scala generics covariance


【解决方案1】:

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

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

【讨论】:

  • 嗯,任何想法为什么我能够序列化 scala 列表,如果它没有实现 Serializable?
  • List 是一个抽象类,您序列化的是case class ::,它是它的具体子类。默认情况下,案例类是可序列化的。
猜你喜欢
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2012-09-05
相关资源
最近更新 更多