2013-09-07 10 views

cevap

24
  • I.:

    def readValue[T:ClassTag](s:String):T = { 
        val tClass = implicitly[ClassTag[T]].runtimeClass 
        //implementation for different classes. 
    } 
    

    kullanım Java biraz daha nettir:

    val myDouble = readValue[Double]("1.0") 
    
+0

Mükemmel, teşekkürler Arseniy ... o yüzden görünüşte 4 dakika içinde cevap kabul edebilir: Başka, daha karmaşık bir yol, (tip sınıfı) bazı kullanıcı tarafından sağlanan nesneye readValue uygulanmasını yansıtmak için o zaman yapacak. – Neil

+0

Bir şey değil. Yöntemi uyguladıktan ve II cevabına baktığınızda, onu daha geniş ve modüler bulursunuz. –

+0

@Neil, ClassTag'lar Scala'da bunu yapmanın deyimsel yoludur, ancak 'Class' nesnelerini doğrudan Java'da yaptığınız gibi iletebilirsiniz: read readValue [T] (s: String, cls: Class [ T]): T' - tanım, 'readValue (" 1.0 ", classOf [Double]) - kullanımı. Bu deyimsel değildir, ancak bazen yardımcı olabilir. –

2
  • II.

    trait ValueReader[T] { 
        def readValue(s: String): T 
    } 
    
    def readValue[T: ValueReader](s: String): T = { 
        val reader = implicitly[ValueReader[T]] 
        reader.readValue(s) 
    } 
    
    implicit val doubleReader = new ValueReader[Double] { 
        def readValue(s:String) = // implementation for Double 
    }