2011-03-18 12 views
10

"Tür varyasyon ek açıklamaları" (+ ve -) "tip üyelere" uygulanamaz.Tür Üyeler ve Kovaryans

class StringBox extends Box { type T = String; override val element = ""}

yüzden Boxolduğunu söyleyebiliriz: kendime açıklamak amacıyla benBox uzatmak ben zorunda sınıfı StringBox oluşturmak istiyorsanız Şimdi aşağıdaki example

abstract class Box {type T; val element: T}

kabul doğal olarak T türünde kovaryantı. Başka bir deyişle, tip üyeleri olan sınıflar bu türlerde eşdeğerdir.

Mantıklı mı?
Tür üyeleri ve yazım varyansı arasındaki ilişkiyi nasıl tanımlarsınız?

+0

Eğer Paul en kabul cevabı değiştirmek misiniz? Benimki yeterli değil. –

+0

@ DanielC.Sobral Bitti. Teşekkürler – Michael

cevap

14

Kutu T türünde değişkendir, ancak bu, görülecek hiçbir şey olmadığı anlamına gelmez.

abstract class Box { 
    type T 
    def get: T 
} 
type InvariantBox = Box { type T = AnyRef } 
type SortofCovariantBox = Box { type T <: AnyRef } 

Varyans durumunu değiştiren şey, türün açığa çıkma derecesi ve ne şekilde yapıldığıdır. Soyut türler daha opaktır. Ama bu konularda repl ile oynamalısın, oldukça ilginç.

# get a nightly build, and you need -Ydependent-method-types 
% scala29 -Ydependent-method-types 

abstract class Box { 
    type T 
    def get: T 
} 
type InvariantBox = Box { type T = AnyRef } 
type SortofCovariantBox = Box { type T <: AnyRef } 

// what type is inferred for f? why? 
def f(x1: SortofCovariantBox, x2: InvariantBox) = List(x1, x2) 

// how about this? 
def g[U](x1: Box { type T <: U}, x2: Box { type T >: U}) = List(x1.get, x2.get) 

Ve vb

İlgili konular