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
}