请参阅以下计划:
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