将Scala类作为参数传递?

时间:2015-01-23 15:14:09

标签: scala

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

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

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

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

3 个答案:

答案 0 :(得分:24)

那么,对于您的原始问题:是的,您可以将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

答案 1 :(得分:5)

是。一般情况下,它是ClassTag / TypeTag - 请参阅MirrorsReflection

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

答案 2 :(得分:0)

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

所以我并没有声称要解决问题的标题,而是你要发布的具体需求。要检查特定对象是否属于特定类型,Scala中的典型方法是使用模式匹配。除非我遗漏了某些内容,否则此应该工作

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

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