2010-08-13 14 views
8

Scala generics hakkında: T öğesi türü için sınıf bildirimini bulamıyor

def reverse[T](a: Array[T]): Array[T] = { 
    val b = new Array[T](a.length) 
    for (i <- 0 until a.length) 
     b(i) = a(a.length -i - 1) 
    b 
} 
def reverse[T](a: Array[T]): Array[T] = { 
    val b = new Array[T](a.length) 
    for (i <- 0 until a.length) 
     b(i) = a(a.length -i - 1) 
    b 
} 
def reverse[T](a: Array[T]): Array[T] = { 
    val b = new Array[T](a.length) 
    for (i <- 0 until a.length) 
     b(i) = a(a.length -i - 1) 
    b 
} 
def reverse[T](a: Array[T]): Array[T] = { 
    val b = new Array[T](a.length) 
    for (i <- 0 until a.length) 
     b(i) = a(a.length -i - 1) 
    b 
} 

"Hata: satır öğesi 2 için sınıf öğesi T'yi bulamıyor" alıyorum

Bunu çözmek için yine de var mı?

cevap

10

Basitçe yöntem ilanına ClassManifest bağlı bir bağlam ekleyin: bir dizi oluşturmak amacıyla

def reverse[T : ClassManifest](a: Array[T]): Array[T] = ... 

, dizi somut tip derleme zamanında bilinmelidir. Bu tür, örtük bir ClassManifest parametresi aracılığıyla derleyici tarafından sağlanır. Dizi yapıcısı çağrıldığında yani Dizi kurucu imzası bu parametreyi tedarik etmek amacıyla fiilen

Array[T](size: Int)(implicit m: ClassManifest[T]): Array[T] 

olduğunu kapsamda bir ClassManifest olmalıdır. İkincisi, daha basit notasyonu bir context bound denir

def reverse[T](a: Array[T])(implicit m: ClassManifest[T]): Array[T] = ... 
// or equivalently 
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ... 

: Bu nedenle, ters yöntem, aynı zamanda örtük bir ClassManifest parametresini almalıdır.

+0

bir bağlanmış bağlamda ClassManifest' 'yerine' Manifest' kullanabilir. Fark ne? –

+0

İyi soru. Sadece aynı şeyi kendim bulmaya çalışıyorum :-) –

+0

Manifest, scala.reflect.Manifest için ScalaDoc'ta belgelenmeyen bir tür takma addır (belki de derleyici sihirbaz olduğu için). Bu nedenle, ClassManifest'i sadece netlik için tercih ediyorum. –

2

kullanılarak [T: ClassManifest] o kaldırıldı kullanımı Gösteriliyorsa [T: ClassTag]

İlgili konular