Scala 捕获varargs参数的类型
我想定义一个接受varargs的方法,这样即使在null的情况下也能得到调用它的类型Scala 捕获varargs参数的类型,scala,Scala,我想定义一个接受varargs的方法,这样即使在null的情况下也能得到调用它的类型 def foo(args: Any*) = .... val s: String = null foo(1, s) // i'd like to be able to tell in foo that args(0) is Int, args(1) is String 如果使用Any作为参数类型,则无法静态确定参数的类型。您必须使用instanceof或模式匹配: def foo(args: Any*)
def foo(args: Any*) = ....
val s: String = null
foo(1, s) // i'd like to be able to tell in foo that args(0) is Int, args(1) is String
如果使用
Any
作为参数类型,则无法静态确定参数的类型。您必须使用instanceof
或模式匹配:
def foo(args: Any*) = for (a <- args) a match {
case i: Int =>
case s: String =>
case _ =>
}
因为您使用的是
Any
作为类型,所以无法获取参数的类型。TypeAny
没有getClass
方法(它甚至根本不是引用类)。有关更多信息,请参阅
您可以尝试的是:
def foo(args: Any*) = args.map { arg => {
arg match {
case reference:AnyRef => reference.getClass.toString
case null => "null"
}}}
val s: String = null
val result = foo("a", 1, 'c', 3.14, s, new Object, List(1), null)
result.foreach(println)
这将产生:
class java.lang.String
class java.lang.Integer
class java.lang.Character
class java.lang.Double
null
class java.lang.Object
class scala.collection.immutable.$colon$colon
null
就最初的问题而言,我很确定这是不可能的
如果不确切知道您想要实现什么(即,为什么它必须是任意类型的可变长度列表),就很难提供替代方案。然而,当我读到这个问题时,我想到了两件事,这可能是您的一个选择:与命名参数(需要Scala 2.8+)结合使用,以及数据类型(不太可能)。或使用支持键入“varargs”的语言,如TypedScheme:)与以下内容相关:
class java.lang.String
class java.lang.Integer
class java.lang.Character
class java.lang.Double
null
class java.lang.Object
class scala.collection.immutable.$colon$colon
null