Scala 类型界限/多态性混淆

Scala 类型界限/多态性混淆,scala,types,Scala,Types,我有点了解Scala类型系统的基本知识,但还不够好!为什么下面两个函数的返回类型不被认为是等价的 trait Base[T] case class Foo() extends Base[Foo] case class Bar() extends Base[Bar] def willNotCompile[T <: Base[_]](x: Int): T = if(x < 10) new Foo() else new Bar() def compilesFine(x: Int):

我有点了解Scala类型系统的基本知识,但还不够好!为什么下面两个函数的返回类型不被认为是等价的

trait Base[T]
case class Foo() extends Base[Foo]
case class Bar() extends Base[Bar]

def willNotCompile[T <: Base[_]](x: Int): T =
  if(x < 10) new Foo() else new Bar()

def compilesFine(x: Int): Base[_] =
  if(x < 10) new Foo() else new Bar()
willNotCompile的返回类型由调用方确定。因此,T可能不是FO和Bar的超类型,因此它不会编译考虑实例类BAZ扩展基[BAZ];不会编译[Baz]42


compilesFine的返回类型始终为Base[3;]。

第一个函数的类型规定,对于任何人选择的所有T,只要它们是Base的子类型,该函数必须返回该类型的值。后一个函数不承诺类似的内容,它只返回Base类型。实际上,我并不认为Base的type参数与本例相关

例如,考虑我的定义:

case class Baz() extends Base[Baz]
那么willNotCompile的类型将允许我调用

willNotCompile[Baz](0)
我应该得到一个Baz类型的值!显然,情况并非如此,因此定义没有进行类型检查

另一个函数没有声明返回任何比Base更具体的类型,因此没有问题

FWIW,这个例子证明了参数多态性,也就是泛型,比单纯的子类型更具表现力