这感觉非常基本;对不起,我很抱歉。
考虑
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不是变体。)
答案 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