将 Scala Class 作为参数传递?

Passing Scala Class as parameter?

我希望将 Class 作为参数传递给 Scala 函数,如下所示:

def sampleFunc (c : Class) : List[Any]  

(附带问题:参数中的类型应该是Class还是Class[_]?)

我传递 Class 类型的原因是检查对象是否属于特定类型。目前,作为解决方法,我将示例对象传递给方法并比较两个对象的 .getClass 结果。虽然我不认为这是理想的,但我确信在 Scala 中有明确定义的类型传递方式。

是的。一般情况下是 ClassTag/TypeTag - see Mirrors and Reflection

import scala.reflect._
def runtimeClass[T: ClassTag] = classTag[T].runtimeClass

scala> runtimeClass[String]
res2: Class[_] = class java.lang.String

如果您真的只需要检查编译时(正式)类型是否相等

scala> implicitly[String =:= Double]
<console>:14: error: Cannot prove that String =:= Double.
          implicitly[String =:= Double]
                    ^

如果您真的只需要检查对象类型:

 scala> "aa".isInstanceOf[String]
 res4: Boolean = true

好吧,对于您最初的问题:是的,您可以将 Scala Class 作为参数传递。 由于 Class 是一个类型构造函数,它需要一个具体类型来创建一个要在参数中使用的类型。您可以像以前一样使用通配符存在类型 Class[_]

def sample(c: Class[_]) = println("Get a class")
sample(classOf[Int])

但是,如果你想检查一个对象是否属于某种类型,我建议你使用=:=,结合默认参数

def checkType[T](obj: T)(implict ev: T =:= Int = null) =
  if (ev == null) "get other"
  else "get int"
checkType(123) // get int
checkType("123") // get other

在 Scala 中,如果您需要处理 类,可能有不同的方法来解决这个问题。

所以我不是声称要解决问题的标题,而是具体需要你post。要检查特定 object 是否属于特定类型,Scala 中的典型方法是使用模式匹配。除非我遗漏了什么,否则这个 应该 有效

def checkType(obj: Any) = obj match {
  case y: Int => "get int"
  case _ => "Other"
}

http://docs.scala-lang.org/tutorials/tour/pattern-matching.html