Вы назвали свой параметр типа String
вместо T
, но это не делает его менее абстрактным, он может быть чем угодно.
def to[String]:String
// is the same as
def to[T]:T
Если вы хотите создать общую функцию .to[T]
, которая возвращает приветствие при вызове с String
, т. е. вы хотите, чтобы тип соответствовал шаблону, вы можете использовать TypeTag
:
Правка: я просто упустил из виду, что тип возвращаемого значения должен быть T
, а это означает, что должно быть бесполезное приведение, см. ниже.
import reflect.runtime.universe._
def to[T : TypeTag] = (typeOf[T] match {
case t if t =:= typeOf[String] => "hello"
case t if t =:= typeOf[Int] => 1
case _ => ???
}).asInstanceOf[T]
а также:
scala> to[String]
res13: String = hello
scala> to[Int]
res14: Int = 1
scala> to[Double]
scala.NotImplementedError: an implementation is missing
...
Я не уверен, что есть способ заставить компилятор самостоятельно сделать вывод о том, что вещи внутри совпадения с шаблоном имеют правильные типы. Это может быть возможно с ClassTag
, но вы потеряете безопасность типов с .to[List[Int]]
и подобным...
person
gourlaysama
schedule
20.06.2013
String
. просто замените его чем-то вродеT
и вы поймете, почему он не компилируется. - person tenshi   schedule 20.06.2013