Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 捕获varargs参数的类型_Scala - Fatal编程技术网

Scala 捕获varargs参数的类型

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*)

我想定义一个接受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*) = for (a <- args) a match {
  case i: Int =>
  case s: String =>
  case _ =>
}

因为您使用的是
Any
作为类型,所以无法获取参数的类型。Type
Any
没有
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