2013-09-07 16 views
10

Co jest równoznaczne z następującym oświadczeniem metoda Java w Scala:Scala: Deklarowanie metoda z parametrem typu generic

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

Innymi słowy, chciałbym zadeklarować metodę, która przyjmuje klasę typu T i zwraca instancję tego typu.

Odpowiedz

24
  • I. Bardzo blisko tego, co chcesz:

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

    użycie jest nieco jaśniejsze niż w Javie:

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

Perfect, dzięki Arsenij ... mogę zaakceptować swoją odpowiedź w 4 minuty najwyraźniej, tak zrobi to wtedy. – Neil

+0

Nie ma za co. Kiedy zaimplementowałeś metodę i spojrzałeś na odpowiedź II, stałbyś się bardziej rozciągliwy i modułowy. –

+0

@Neil, 'ClassTag's to idiomatyczny sposób na zrobienie tego w Scali, ale możesz przekazać obiekty' Class' bezpośrednio tak, jak zrobiłbyś to w Javie: 'def readValue [T] (s: String, cls: Class [ T]): T' - definicja, 'readValue (" 1.0 ", classOf [Double])' - użycie. To nie jest idiomatyczne, ale czasami może być pomocne. –

2
  • II. Innym, bardziej zaangażowany sposób, to uzewnętrznić realizację readValue do jakiegoś przedmiotu przez użytkownika warunkiem (klasa typ):

    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 
    } 
    
Powiązane problemy