dan*_*man 30 java scala variadic-functions
Java有:
public void someMethod(int ... intArray) { // question: what is the equivalent to "..."
// do something with intArray
}
Run Code Online (Sandbox Code Playgroud)
如何在Scala中实现相同的功能?也就是说,将未定义数量的参数传递给方法?
Von*_*onC 49
Java和Scala都有varargs,两者都只支持最后一个参数.
def varargTest(ints:Int*) { ints.foreach(println) }
Run Code Online (Sandbox Code Playgroud)
从这篇文章中,区别在于用于varargs参数的类型:
'*'代表0或更多参数.
注意:如果参数值已经"打包"为序列(例如列表),则会失败:
# varargTest(List(1,2,3,4,5))
# //--> error: type mismatch;
# //--> found : List[Int]
# //--> required: Int
# //--> varargTest(List(1,2,3,4,5))
# //-->
Run Code Online (Sandbox Code Playgroud)
但这将通过:
varargTest(List(1,2,3):_*)
//--> 1
//--> 2
//--> 3
Run Code Online (Sandbox Code Playgroud)
' _'是类型推断的占位符快捷方式.' _*'在这里适用于'重复类型'.Scala规范的
4.6.2节提到:
参数部分的最后一个值参数可以以"
*”例如 "为后缀(..., x:T *).
然后,方法内的这种重复参数的类型是序列类型scala.Seq[T].
具有重复参数的方法采用T*可变数量的类型参数T.
(T1, . . . , Tn,S*)U => (T1, . . . , Tn,S, . . . , S)U,
Run Code Online (Sandbox Code Playgroud)
此规则的唯一例外是,如果最后一个参数通过
_*类型注释标记为序列参数.
(e1, . . . , en,e0: _*) => (T1, . . . , Tn, scala.Seq[S]).
Run Code Online (Sandbox Code Playgroud)
注意:请注意Java的基础类型擦除:
//--> error: double definition:
//--> method varargTest:(ints: Seq[Int])Unit and
//--> method varargTest:(ints: Int*)Unit at line 10
//--> have same type after erasure: (ints: Sequence)Unit
//--> def varargTest(ints:Seq[Int]) { varargTest(ints: _*) }
Run Code Online (Sandbox Code Playgroud)
Joe*_*Joe 43
def someMethod(values : Int*)
Run Code Online (Sandbox Code Playgroud)
给出一个数组.将变量参数参数作为最后一个形式参数.
| 归档时间: |
|
| 查看次数: |
29210 次 |
| 最近记录: |