2011-07-19 20 views
5

Belirli bir singleton sınıfının bir özelliği uygulayıp uygulamadığını kontrol etmek için aşağıdaki işlevi yazdım. AncakParametre verilen türlerde Scala yansıması

trait A 
object B extends A 

assert(maybeMakeSingletonObj[A](B.getClass()) === Some(B)) 

Aşağıdaki örnekte üzerinde başarısız:

/** Given a singleton class, returns singleton object if cls implements T.             
* Else returns None. */ 
def maybeMakeSingletonObj[T: ClassManifest](cls: Class[_]): Option[T] = { 
    try { 
    val m = classManifest[T] 
    val obj = cls.getField("MODULE$").get(m.erasure).asInstanceOf[AnyRef] 

    if (Manifest.singleType(obj) <:< m) Some(obj.asInstanceOf[T]) 
    else None 
    } catch { 
    case e: Exception => None 
    } 
} 

Bu kod aşağıdaki örnekte üzerinde çalışıyor

trait A[T, R] 
object B extends A[Int, Int] 

assert(maybeMakeSingletonObj[A[_,_]](B.getClass()) === Some(B)) 

Herhangi bir fikir? "Tip-ilişkisi operatörleri <: < ve =:. Henüz yeterince manifestolarına temsil edilmeyen tip uygunluk sayısız yönleri olduğu gibi = sadece tahminidir düşünülmelidir" ScalaDoc itibaren

+0

Bu hatayı açıklarsanız veya en azından kendi kendine yeten kodlar içeriyor olsanız yardımcı olur. –

+0

Kod bağımsızdır. Başarısızlık, basitçe, belki deMakeSingletonObj'nin ikinci durumda bazı (B) döndürmemesidir. Açık kontrol, ilk durumda olduğu gibi çalışmıyor. Ayrıca, geri gönderilen bir Özel Durum nedeniyle değil, ancak açık çek nedeniyle. –

+0

Acaba bunun nedeni siliniyor mu? Benim anlayışım, parametrelendirmelerin derlemeden kurtulmalarının gerekmediği - yani yansıma ile onları görmek mümkün değil. Yine de yanlış olabilir. – Owen

cevap

3

Görünüşe göre, bu böyle bir durumdur.

İlgili konular