案例类列表与T&lt ;: Serializable

时间:2017-11-28 12:06:58

标签: scala serialization

给定类型定义T <: Serializable,为什么不匹配可序列化的所有内容,包括可序列化实例列表?

即。给出:

case class Bar()

def foo[T <: Serializable](param1: T) = println(param1)

foo(Bar())
foo(List(Bar()))

编译器出现以下错误:

Error:(6, 2) inferred type arguments [List[A$A15.this.Bar]] do not conform to method foo's type parameter bounds [T <: Serializable]

案例类扩展SerializableList也是如此 - 为什么条形列表不匹配类型?

1 个答案:

答案 0 :(得分:4)

  

案例类扩展SerializableList

也是如此

仅适用于Scala 2.12.x(https://issues.scala-lang.org/browse/SI-7402)。先前版本(2.11和2.10)在List上没有Seri​​alizable特征。如果您使用2.12,您的代码将按预期编译。

以下答案考虑了先前版本的实施:

List[T]不会扩展可序列化,它会派生::Nil。明确使用::.apply

时,您可以看到这一点
foo(::(1, Nil))

由于推断类型为::(或缺点),因此编译。相反:

foo(1 :: Nil)

不是因为::上的List方法返回List[A],而不是::

另一件事是List.apply始终是运行时::Nil(因为List是抽象的),这就是测试的原因,例如:

List(1,2,3).isInstanceOf[Serializable]

收益率true。如果我们检查底层运行时类,我们会看到:

List(1, 2, 3).getClass.getName

产量

scala.collection.immutable.$colon$colon