为何Scala REPL中res2被推断为List<Any>而非List<Serializable>?
为什么
listOf(1, 'A')被推断为List[Any]而不是List[Serializable]? Scala的类型推断核心是找最具体的共同父类型,咱们拆解三个例子的差异就能明白原因:
对于
listOf('A', Pair('X', 'Y'))和listOf(1, Pair('X', 'Y')):Pair(...)是Scala引用类型(属于AnyRef体系),天然实现Serializable接口;'A'(Char)和1(Int)作为值类型,在与引用类型交互时会自动装箱为java.lang.Character和java.lang.Integer——这两个Java包装类都实现了Serializable;- 所有元素的最具体共同类型就是
Serializable,因此推断出List[Serializable]。
而
listOf(1, 'A')的特殊点在于:1(Int)和'A'(Char)都是Scala值类型,它们的直接共同父类型是AnyVal;- 但
AnyVal本身并不继承Serializable(Serializable属于AnyRef体系的接口); - Scala不会主动把两个值类型都装箱成Java包装类来凑
Serializable,而是继续向上找最具体的共同父类型,最终落到Any(AnyVal和AnyRef的共同父类),所以推断出List[Any]。
如果想得到List[Serializable],可以显式指定类型:
listOf[java.io.Serializable](1, 'A')
这样Scala会强制将两个值类型装箱为对应的Serializable实现类,得到预期的类型。
内容的提问来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

