给定类型定义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]
案例类扩展Serializable
,List
也是如此 - 为什么条形列表不匹配类型?
答案 0 :(得分:4)
案例类扩展
也是如此Serializable
,List
仅适用于Scala 2.12.x(https://issues.scala-lang.org/browse/SI-7402)。先前版本(2.11和2.10)在List
上没有Serializable特征。如果您使用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