2013-02-03 26 views
6

Derleyici bana bunun şu uyarıyı vermeyeceğini söylüyor: "A tipi eşdeğerde A tipinde: A <: B tipi biri" Uyarı, oluşturma yönteminin type parametresindedir. Mantıksal olarak tür tanımı bana mantıklı geliyor. Derleyicinin ve sonra hiçbir niteliği yoksa, niçin sorun ile sorun?Scala derleyicisi neden tip A:: A <: B türünde eşdeğişkende G karşıt değişkeni meydana geldiğini söylüyor?

trait Foo[-A]{ 
    def compose[B >: A](t: Foo[B]): Foo[A] = t andThen this 
    def andThen[B <: A](t: Foo[B]): Foo[B] 
} 

Tek ihtiyacım olan şey, bozulduğu bir örnektir. O zaman ben mutluyum.

cevap

4

Hatanın dediği gibi, A'un varyans açıklamanız yanlış. A'u bir kovaryant pozisyon olan bir dönüş türünde kullanamazsınız. Şimdi

trait Foo[-A] { 
    ... 
    def foo(a: A): Unit 
} 

bu çöküyor nasıl görebilirsiniz: Eğer (bağımsız değişken olarak) uygun kontravaryant pozisyonunda A kullanan Foo yılında başka bir yöntemi vardı hayal

  • Foo[-A] ima Foo[X] <: Foo[Y]
  • X >: Y eğer döndürülen değer,
  • bildirilen dönüş türünün alt türü olabilir, bu nedenle -A yasal ise, compose bazı A1 >: A
  • trait X söylemek için Foo[A1] döndürebilir ve trait Y extends X { def bar() }
  • hayal Foo[Y] nerede foo aramalar a.bar() dolayısıyla
  • compose için örneğin Foo[X]

Yani dönmesine izin verildi eğer kıracak derleme, A değişmez olmalıdır.

İlgili konular