为什么类型推断变得更少" permissive"如果方法过载?

时间:2015-08-25 21:26:41

标签: scala

请参阅以下计划:

sealed trait Hierarchy
case class Leaf1() extends Hierarchy
case class Leaf2() extends Hierarchy

// I could make it [+T], but it used to compile without it.
class Container[T](val things: Seq[T])

object Container {
  def apply[T](things: T*): Container[T] = {
    new Container(Seq(things:_*))
  }
}

class Doer(things: Container[Hierarchy])

object Doer {
  def apply(things: Container[Hierarchy]): Doer = {
    new Doer(things)
  }

// Does not compile if uncommented.
//  def apply(things: Hierarchy*): Doer = {
//    new Doer(Container(things: _*))
//  }
}

class Test1 {
  def main(args: Array[String]) {
    Doer(Container(Leaf1()))
  }
}

我有Container[T]中不变的通用容器T;以及从arglist Container.apply()构建它的方式(T*)。

现在注意方法Doer.apply,它接受​​Container[Hierarchy]类型的参数。显然,它不能使用Container[Leaf1]的参数,但原始代码会编译,即Scala似乎推断Container(Leaf1())具有类型Container[Hierarchy]

但如果我取消注释Doer.apply()的重载,我会收到以下错误。也就是说,Scala开始认为Container(Leaf1())的类型为Container[Leaf1]

  

错误:(29,5)重载方法值适用于替代方案:
  (东西:层次结构*)Doer(东西:容器[Hierarchy])Doer   无法应用(Container [Leaf1])       杜尔(集装箱(Leaf1()))       ^

你能解释一下这里发生了什么吗?

我可以在Container中制作T协变(例如,它是一个不可变的容器),但我想首先了解正在发生的事情。

Scala 2.11.7,JDK 1.8u45

0 个答案:

没有答案