为什么构造函数不兼容scala中的协方差

时间:2014-11-16 13:00:37

标签: scala

我有以下类定义,C定义为采用协方差类型参数+ T,我尝试将另一个构造函数方法定义为快捷方式,但我无法使其与类型T一起使用。

class C[+T](val value: T, children: List[C[T]]) {
   def this(value: T) = this(value, Nil)  //it fail with covariant type not allowed here

   def this[U >: T](value: U) = this(value, Nil)//it fail with can't find symbol U

   def replace[U >: T](t: U) = new C(t, children) //it success
}

我认为第二个应该像替换方法一样工作,但它没有。可能有人解释这背后的原因,为什么替换工作但不是这个?以及正确的方法。感谢。

1 个答案:

答案 0 :(得分:0)

  

为什么替换工作而不是这个?

构造函数无法获取类型参数(这是我在2.10而不是can't find symbol U中获得的消息)。但即使可以,replace返回C[U],构造函数也必须返回C[T]

  

以及正确的方法

将它作为伴侣对象中的方法:

object C {
  def apply[U](value: U) = new C(value, Nil) // note that you no longer need T here
}