2013-02-26 14 views
11

Bir Array döndüren bir işlev tanımlamak istiyorum ve bir TypeTag var. Gerekli ClassTag'ı oluşturabilir miyim?Scala 2.10'da, bir TypeTag verilen bir ClassTag nasıl oluşturulur

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> def fun[X: TypeTag]: Array[X] = Array.ofDim[X](10) 
<console>:11: error: No ClassTag available for X 
     def fun[X: TypeTag]: Array[X] = Array.ofDim[X](10) 

Ya da gerekli ClassTag örtülü kanıt sağlamaktır:

scala> import reflect.ClassTag 
import reflect.ClassTag 

scala> def fun[X: ClassTag: TypeTag]: Array[X] = Array.ofDim[X](10)(implicitly[ClassTag[X]]) 
fun: [X](implicit evidence$1: scala.reflect.ClassTag[X], implicit evidence$2: reflect.runtime.universe.TypeTag[X])Array[X] 

Ben basit bir TypeTag bir ClassTag oluşturmak için sanırdım, ama belirgin bir şekilde görmek. Eğer gerçekten ilk etapta bir TypeTag geçmesi gerektiğini olsa

def fun[X:TypeTag]: Array[X] = { 
    val mirror = runtimeMirror(getClass.getClassLoader) 
    implicit val xClassTag = ClassTag[X](mirror.runtimeClass(typeTag[X].tpe)) 
    Array.ofDim[X](10) 
} 

emin olmak istersiniz:

+0

Olası kopyası [ClassTag formu TypeTag veya her ikisi de aynı anda nasıl alınır?] (Http://stackoverflow.com/questions/18729321/how-to-get-classtag-form-typetag-or-both- at-same-time) – Suma

cevap

8

Burada daha basit bir çözüm görmek isterim ama ben ile geldi budur . Bunun yerine bir ClassTag iletemez misiniz (def fun[X: ClassTag]'da olduğu gibi)?

+0

Sorun gerçekten kozmetiktir, bir fonksiyon kapsamında bir TypeTag'a ihtiyacım var, fakat bu fonksiyon içindeki bir arama sitesindeki ClassTag ve ClassTag'ı tüm yolla örtüştürmek için ekstra tip gürültüye sahip olmamayı tercih ederim. çağrı zincirini kapatın. –

İlgili konular