Scala: объявление метода с параметром generic type

Что эквивалентно следующему объявлению метода Java в Scala:

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

Другими словами, я хотел бы объявить метод, который принимает класс типа T, и возвращает экземпляр этого типа.

Ответ 1

  • я. Очень близко к тому, что вы хотите:

    def readValue[T:ClassTag](s:String):T = {
      val tClass = implicitly[ClassTag[T]].runtimeClass
      //implementation for different classes.
    }
    
    Использование

    немного яснее, чем в Java:

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

Ответ 2

  • II. Другим, более привлекательным способом является экстернализация реализации readValue для некоторого объекта, предоставленного пользователем (класс типа):

    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
    }