给出以下特征和2个子类:
scala> trait Parent
defined trait Parent
scala> case object Kid extends Parent
defined object Kid
scala> case object Child extends Parent
defined object Child
我创建了一个返回Kid
或Child
的函数。但推断的返回类型是Product with Serializable with Parent
。
scala> def f(x: Int) = if (true) Kid else Child
f: (x: Int)Product with Serializable with Parent
然后,我重写了相同的函数,除了我明确地注释它的类型:
scala> def g(x: Int): Parent = if (true) Kid else Child
g: (x: Int)Parent
请解释f
的推断类型。
答案 0 :(得分:5)
Case对象总是从Product
和Serializable
继承(这由编译器透明地完成)。
此外,Kid
和Child
显式扩展Parent
因此Kid
和Child
都是Product with Serializable with Parent
的子类型。
因为它们没有其他常见类型,所以这是它们的最小上限。