2016-12-05 26 views

cevap

8

Derleyici özel bir örneğine ait T S#Ttest için bağımsız değişken olarak kullanılabileceğini olmayan yeterli kanıt vardır somut örnekte.

trait A2 extends A{ 
    type T <: AnyRef 
} 

class A3 extends A2{ 
    override type T = Integer 

    def test(t: Integer): Unit = println(t * 2) 
} 

Yani B[A2]<: AnyRefA3 ederken ihtiyaçları tam olarak Integer kendi test uygulanması için hiçbir şey birlikte A3 örneğini kabul etmelidir zayıflamış scala derleyicisi için bu hypotecical örneği inceleyin

Sen beton yakalayabilirsiniz

Ne tür kullanılacağını öğrenmek için B tanımında yazın
+2

Ama 'B [A2] (yeni A3()," ")' derler, fakat kodumda bunu kastettiniz mi? Aksi takdirde çözümünüz tam olarak ihtiyacım olan şeydir. – JbGi

+0

Ha, zekice bir numara! Arıtmada sağdaki görüntünün tip parametresini kullanabileceğini bilmiyordum. – Haspemulator

+0

@JbGi Evet Bunu gerçekten derlenmiş bir örnekle göstermeyi çok düşündüm, ancak scala derleyicisi burada oldukça kısıtlayıcı. Öyleyse bu hayali bir scala-benzeri derleyicinin hayali bir örneğini saklayalım, orijinal kaynağı – Odomontois

2

I (basitleştirme için türü parametreleri kaldırıldı) kodlamaları ile gelebilir:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

def test0(a: A)(t : a.T) = a.test(t) 

abstract class B{ 
    val a: A 
    val t: a.T 
    def test = a.test(t) 
} 

// Exiting paste mode, now interpreting. 

test0: (a: A)(t: a.T)Unit 
defined class B 

Bu, diğer taraftan durum sınıfları argümanları (ne de bu konuda sınıfları) ile çalışmadı. Kodlamanız işe yaramaz nedenlerinden

biri: (A#T karşı)

scala> def test1(a: A)(t : A#T) = a.test(t) 
<console>:12: error: type mismatch; 
found : t.type (with underlying type A#T) 
required: a.T 
     def test1(a: A)(t : A#T) = a.test(t) 

önemli parçası required: a.T olduğunu. A test yöntemi T this.T alır ya da başka bir deyişle, herhangi bir T almaz, A.

+0

Teşekkür! Bu daha iyi anladım! Yani 'a' yolu 'bağımlı bağımlı tip' denir? – JbGi

+0

Tam olarak, bu yola bağımlı bir türüdür. – pedrofurla

1

yerine bir tür projeksiyon Bağımlı tipini a.T kullanabilirsiniz:

trait A { 
    type T 
    def test(t: T): Unit 
} 

case class B[S <: A](a: S)(t : a.T) { 
    def test() = a.test(t) 
}