“覆盖”继承了方差

时间:2013-03-06 02:33:41

标签: scala

这感觉非常基本;对不起,我很抱歉。

考虑

trait Foo[+T] { def t : T }  
trait Bar[+S,+T] extends Foo[T] { def s : S }  
trait Baz[+S,T] extends Foo[T] { def s : S }

Foo中T的协方差是否自动适用于Baz,即使Baz中的T未标记为协变? Bar和Baz的行为会有什么有意义的区别吗?

(玩起来,这两种形式似乎很难区分。如果它们是相同的,不知何故感觉很脏Baz形式没有警告或发出错误信号,因为单独看Baz你会期望T不是变体。)

1 个答案:

答案 0 :(得分:5)

不,Baz[T]不会继承Foo[+T]的协方差。必须明确标记协方差。这是一个例子,

class Foo[+T] {}
class Baz[T] extends Foo[T] {}

(new Foo[String]) : Foo[Any] // Ok: Foo[+T] is covariant
(new Baz[String]) : Foo[Any] // Ok: Baz[String] <: Foo[String] <: Foo[Any]
(new Baz[String]) : Baz[Any] // Error: Baz[T] is invariant in type T