将 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
我希望将 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