2013-09-07 26 views
10

Qual è l'equivalente del seguente dichiarazione metodo Java in Scala:Scala: metodo Dichiarando con parametro di tipo generico

public <T> T readValue(java.lang.String s, java.lang.Class<T> tClass) 

In altre parole, mi piacerebbe dichiarare un metodo che accetta una classe di tipo T e restituisce un'istanza di quel tipo.

risposta

24
  • I. Molto vicino a ciò che si vuole:

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

    utilizzo è un po 'più chiaro che in Java:

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

Perfetto, grazie Arseniy ... posso accettare la tua risposta in 4 minuti a quanto pare, in modo lo farò allora. – Neil

+0

Prego. Quando hai implementato il metodo e guardato la risposta II, lo troverai più estensibile e modulare. –

+0

@Neil, 'ClassTag's sono il modo idiomatico per farlo in Scala, ma puoi passare direttamente gli oggetti' Class' come faresti in Java: 'def readValue [T] (s: String, cls: Class [ T]): T' - definizione, 'readValue (" 1.0 ", classOf [Double])' - utilizzo. Questo non è un idioma, ma a volte può essere utile. –

2
  • II. Un altro modo più coinvolti, è quello di esternare implementazione di readValue a qualche oggetto fornito dall'utente (tipo di classe):

    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 
    } 
    
Problemi correlati