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