Scala函数,它从泛型中提取类[3;]
所以我想做的是:Scala函数,它从泛型中提取类[3;],scala,scala-reflect,Scala,Scala Reflect,所以我想做的是: def foo(clazz: Class[_]): Unit = { val int = classOf[Int] val str = classOf[String] val opt = classOf[Option[_]] clazz match { case `int` => println("INT!") case `str` => println("STRING!") case `opt` => foo(claz
def foo(clazz: Class[_]): Unit = {
val int = classOf[Int]
val str = classOf[String]
val opt = classOf[Option[_]]
clazz match {
case `int` => println("INT!")
case `str` => println("STRING!")
case `opt` => foo(clazz.getTheTypeOutOfGeneric) // <- I think you get the idea
}
}
def foo(clazz:Class[)]:单位={
val int=classOf[int]
val str=classOf[String]
val opt=classOf[Option[]]
克拉兹比赛{
大小写`int`=>println(“int!”)
大小写`str`=>println(“STRING!”)
case`opt`=>foo(clazz.getTheTypeOutOfGeneric)//简单地说:Class
不携带任何关于类型参数的信息
比如说
classOf[Option[Int]] eq classOf[Option[String]]
将返回true
。请注意,运算符eq
检查引用相等,因此这两个对象实际上是完全相同的对象
即使有了反射,你也无法获得根本不存在的信息
我建议不要使用Class
值,而是使用类型参数和类型类进行特殊多态性。确切的解决方案取决于您有效地尝试做什么
但是,下面是一个关于类型类如何工作的示例:
def get[F[_], A](a: F[A])(implicit ex: Extractor[A]): Unit = ex.extract
trait Extractor[A] {
def extract: Unit
}
implicit val intExtractor = new Extractor[Int] {
def extract: Unit = println("I am doing something for Int!")
}
implicit val strExtractor = new Extractor[String] {
def extract: Unit = println("I am doing something for String!")
}
val a = Some(1)
get(a)
输出:
I am doing something for Int!
要了解更多信息,我建议您阅读,这本书(除了教您有关无形状的知识外)有助于您了解Scala中泛型编程的更多一般方面
我希望这会有所帮助。由于类型擦除,您无法从类中删除该信息。您需要一个类标签
:
import scala.reflect.runtime.universe._
def foo[T : TypeTag](clazz: Class[T]) = clazz match {
...
case `opt` => foo(typeOf[T].typeArgs.head)
...
}
但是在你这么做之前,一定要查看Type
和TypeTag
,以及scala.reflect.runtime.universe
中的其他好东西-很可能,你会发现一种更简单、更优雅的方法来实现你需要的东西,而不是传递原始的类捕捉这些信息。但通常这并不是必须的this@DominicEgger直接从类
对象?哦,不,我是在扩展你的解释,以使用类型参数,这是正确的方法!还有TypeCase