将Scala类作为参数传递?

Gro*_*lla 17 scala

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

def sampleFunc (c : Class) : List[Any]  
Run Code Online (Sandbox Code Playgroud)

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

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

Her*_*lme 25

那么,对于你原来的问题:是的,你可以传递Scala Class作为参数.作为Class一个类型构造函数,它需要一个具体的类型来使一个类型在参数中使用.您可以像使用的Class[_]那样使用通配符存在类型.

def sample(c: Class[_]) = println("Get a class")
sample(classOf[Int])
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


dk1*_*k14 6

是.一般情况下它是ClassTag/ TypeTag- 见镜子反射

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

scala> runtimeClass[String]
res2: Class[_] = class java.lang.String
Run Code Online (Sandbox Code Playgroud)

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

scala> implicitly[String =:= Double]
<console>:14: error: Cannot prove that String =:= Double.
          implicitly[String =:= Double]
                    ^
Run Code Online (Sandbox Code Playgroud)

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

 scala> "aa".isInstanceOf[String]
 res4: Boolean = true
Run Code Online (Sandbox Code Playgroud)