2012-11-03 76 views

回答

32

这被称为可变数量的参数或简短可变参数。它的静态类型是Seq[T],其中T代表T*。因为Seq[T]是一个接口,所以它不能用作实现,在这种情况下是scala.collection.mutable.WrappedArray[T]。为了找出这样的事情可能是有用使用REPL:

// static type 
scala> def test(args: String*) = args 
test: (args: String*)Seq[String] 

// runtime type 
scala> def test(args: String*) = args.getClass.getName 
test: (args: String*)String 

scala> test("") 
res2: String = scala.collection.mutable.WrappedArray$ofRef 

可变参数通常在组合与_*符号,这是一个提示编译器将Seq[T]的元素传递给函数,而不是使用

scala> def test[T](seq: T*) = seq 
test: [T](seq: T*)Seq[T] 

// result contains the sequence 
scala> test(Seq(1,2,3)) 
res3: Seq[Seq[Int]] = WrappedArray(List(1, 2, 3)) 

// result contains elements of the sequence 
scala> test(Seq(1,2,3): _*) 
res4: Seq[Int] = List(1, 2, 3) 
+1

是的,这有和有趣的效果,你不能马上通过VAR-LEN ARGS,'高清F1中的序列本身(参数为:int *)= args.length; def f2(args:Int *)= f1(args)'。它将在f2定义中给出'找到Seq [Int],而Int需要不匹配错误'。为了规避,你需要'def f2 = f1(args:_ *)'。所以,编译器认为这个参数是一个单一的值,并且在编译时相同的顺序:) – Val

相关问题