SORU
19 Mart 2009, PERŞEMBE


Neden yok't örnek, ne derleme aka (co-contra-ve) çalışma varyans?

Birisi Scala aşağıdaki açıklayabilir this question, aşağıdaki:

class Slot[ T] (var some: T) { 
   //  DOES NOT COMPILE 
   //  "COVARIANT parameter in CONTRAVARIANT position"

}

Arasındaki farkı anladım TveT(eğer kullanırsam . derler içinde ^strong>T). Ama sonra nasıl biri aslında kendi türü içinde kovaryant olan bir sınıf yazma şey yaratmak başvurmadan parametreunparametrized? Nasıl aşağıdaki sadece bir örnek oluşturulabilir sağlayabilirsinizT?

class Slot[ T] (var some: Object){    
  def get() = { some.asInstanceOf[T] }
}

EDİT- şimdi bu aşağıdaki vuruldu:

abstract class _Slot[ T, V <: T] (var some: V) {
    def getT() = { some }
}

bu harika, ama şimdi ben sadece bir tane istiyorum iki tip parametre var. Tekrar sor soruyu böylece ..

Nasıl yazabilirimdeğişmezOlan Slot sınıfkovaryantonun tipi?

2 DÜZENLEYİN: Yaa! var val kullandım. Aşağıdaki istedim

class Slot[ T] (val some: T) { 
}

CEVAP
23 Mart 2009, PAZARTESİ


Genel olarak, birkovaryanttype parametresi sınıf subtyped (alternatif olarak, kistlerinin alt tiplerinin belirlenmesindeki, yani "co-" öneki). bölgeye göre değişir izin verilir hangisi Daha somut olarak:

trait List[ A]

List[Int] Int AnyVal bir alt türü olduğu için List[AnyVal] çalışmaları devam ediyor. Bu tür bir değer List[AnyVal] beklenen List[Int] örneği sağlayabilir anlamına gelir. Bu gerçekten jenerik çalışması için çok kolay bir yoldur, ama değişken veri varlığında kullanıldığında sağlıksız (tip sistem sonları) ortaya çıktı. Bu jenerik Java değişmez. Unsoundness kısa örnek Java dizileri kullanarak yanlışlıkla kovaryant):

Object[] arr = new Integer[1];
arr[0] = "Hello, there!";

Biz sadece tür bir dizi Integer[] türü değeri String atanmış. Bariz sebeplerden dolayı, bu kötü haber. Java tür sistemi aslında derleme zamanında bu sağlar. JVM "yardımsever" at ArrayStoreException çalışma zamanında. bir olacak Scala'nın tür sistemi Array sınıf türü parametre değişmez çünkü bu sorun (bildiri 34 *yerine* 33*) önler.

Varyans başka bir türü olduğunu unutmayıncontravariance. Bu bazı sorunlara neden olabilir açıklıyor gibi çok önemlidir. Contravariance anlamıyla kovaryans tersidir: parametre değişebilirYukarıkistlerinin alt tiplerinin belirlenmesindeki ile. Bir tane var ama kısmen mantıksız olduğundan çok daha az yaygındır, çok önemli uygulama: fonksiyonları.

trait Function1[-P,  R] {
  def apply(p: P): R
}

". Fark bu ^strong>-P tür parametresi üzerinde açıklama. Bir bütün olarak bu beyanı Function1 P karşıtı ve R kovaryant olduğu anlamına gelir. Böylece, aşağıdaki ifade elde edebiliriz:

T1' <: T1
T2 <: T2'
---------------------------------------- S-Fun
Function1[T1, T2] <: Function1[T1', T2']

T1' bir alt (veya aynı tip) ise T1 olmalı dikkat edin T2 T2' için tam tersi. İngilizce olarak, bu aşağıdaki gibi okuyabilirsiniz:

Bir işlevBirbaşka bir işlevi daha fazladırBparametre türüBirparametre bir supertype türüdürBdönüş türüBirdönüş bir alt türB.

Bu kural nedeni okuyucu (ipucu: fonksiyonlar subtyped gibi farklı durumlarda, yukarıdan dizi benim gibi) düşünmek için bir egzersiz olarak bırakılmıştır.

Co - contravariance yeni bulunan bilgi ile, aşağıdaki örnek derlenir değil neden görmek gerekir:

trait List[ A] {
  def cons(hd: A): List[A]
}

Sorun A cons fonksiyonu parametre türü olmasını beklerken kovaryantkarşıtı. Böylece, A yanlış yönde değişen. İlginçtir ki, yapabiliriz bu sorunu çözmek yaparak List karşıtı A ama sonra dönüş türü List[A] olurdu geçersiz olarak cons işlev beklediğini dönüş türükovaryant.

Bizim sadece iki seçenek burada bir araya A değişmeyen, kaybeden güzel, sezgisel sub-yazma özellikleri, kovaryans, veya b) Ekle bir yerel tür parametresi cons yöntemi tanımlar A gibi bir alt sınır:

def cons[B >: A](v: B): List[B]

Bu artık geçerli değil. A aşağı değişen olduğunu hayal edebiliyorum, ama B A beri A ile ilgili kendi alt sınır yukarı doğru küçülür. Bu yöntem ile bildirimi, A değişkenle birlikte olmak zorundayız ve her şey yoluna girer.

Bu hile sadece 63 ** az-belirli bir türü üzerinde uzmanlaşmış List örneğine dönersek çalışır dikkat edin. Eğer çalışmak List kesilebilir, bir şeyleri yıkmak beri sonunun böyle çalışıyor atamak değerleri yazın B bir değişken tipi A, aç, derleyici tarafından. Mutability olduğunda, değişmezliği ima belirli bir tür, yöntem parametre gerektiren bir tür, bir çevirici olması gerekir. Tek Olası operasyon beri değişmez verileri ile kovaryans çalışır kovaryant dönüş türü verilebilir bir erişimci.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • joshsnice

    joshsnice

    28 Kasım 2006
  • metallmanutza13

    metallmanutz

    13 NİSAN 2007
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008