我希望将一个Class作为参数传递给Scala函数,如下所示:
def sampleFunc (c : Class) : List[Any]
(旁边问题:参数中的类型应该是Class还是Class [_]?)
我传递Class类型的原因是检查对象是否属于特定类型。目前,作为一种解决方法,我将一个示例对象传递给该方法并比较两个对象的.getClass结果。我几乎不认为这是理想的,我确信在Scala中有一种明确定义的传递类型的方法。
答案 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
- 请参阅Mirrors和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
答案 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