4

これは本当に基本的な感じです。ごめんなさい。

検討

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 }

BazのTが共分散としてマークされていなくても、FooのTの共分散は自動的にBazに適用されますか?BarとBazの動作には意味のある違いがありますか?

(遊んでみると、2つの形式を区別するのは難しいようです。同じである場合、Bazだけを見ると、Tが異形ではないと予想されるため、Baz形式が警告またはエラーを通知しないのはどういうわけか汚い感じがします。)

4

1 に答える 1

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
于 2013-03-06T02:42:19.150 に答える