2015-09-18 6 views
2

Дано:Тип печати параметра Тип

scala> def f[A]: Unit = ??? 
f: [A]=> Unit 

Я хотел бы заменить определение для распечатки типа A «s.

Есть ли альтернатива:

scala> def f[A](implicit manifest: scala.reflect.Manifest[A]) = manifest.toString 
f: [A](implicit manifest: scala.reflect.Manifest[A])String 

scala> f[String] 
res10: String = java.lang.String 
+1

Зачем нужна альтернатива? Реализация, которую вы предоставили, делает то, что вам нужно – emilianogc

+0

Мне просто интересно, могу ли я избежать манифеста - если есть более сжатый способ сделать это –

+2

Вам понадобится макрос, чтобы сделать это без манифеста. Было бы неплохо, если вы хотите учиться, но это, безусловно, не приведет к чему-то более кратким. – emilianogc

ответ

12

То есть на самом деле не распечатав типа, это распечатывания класса.

scala> f[List[Int]] 
res17: String = scala.collection.immutable.List[Int] 

Используйте TypeTag, чтобы Получить Типу информацию. Но нет, нет более простого способа. Поскольку это происходит во время выполнения, вам необходимо указать TypeTag для хранения информации о типе.

scala> import scala.reflect.runtime.universe.{TypeTag, typeOf} 
import scala.reflect.runtime.universe.{TypeTag, typeOf} 

scala> def f[A](implicit tt: TypeTag[A]): Unit = println(typeOf[A]) 
f: [A](implicit tt: reflect.runtime.universe.TypeTag[A])Unit 

scala> f[List[Int]] 
scala.List[Int] 

Мы можем сделать это выглядеть более кратким с контекстом, связанный синтаксис:

def f[A : TypeTag]: Unit = println(typeOf[A]) 
Смежные вопросы