
上QQ阅读APP看书,第一时间看更新
3.3.2 spread运算符
再看一下前面示例中带有vararg的max()函数——它使传递不同数量的参数变得更容易。不过,有时我们可能希望将数组或列表中的值传递给具有vararg的函数。即使函数可以接受可变数量的参数,也不能直接发送数组或列表。这就是spread运算符的作用。让我们通过下面的实例,来查看一个使用此运算符的例子:

vararg表示我们可以将任意数量的参数传递给这个参数。但是如果将数组作为参数传递,会得到一个错误:

即使vararg参数的类型在内部是一个数组,Kotlin也不希望传递数组参数。它只接受指定了vararg类型的多个参数。
要使用数组中的数据,可以尝试以下方法:

但这太啰唆了,你也永远不能骄傲地向任何人展示这些代码,即使是你的妈妈。
在参数被注释为vararg的地方,你可以通过在它前面加上spread运算符*来传递一个数组(当然类型是正确的)。让我们将数组values作为参数传递给max()的numbers参数:

这样好些。通过在参数前面放置一个*,要求Kotlin将该数组中的值作为vararg参数的离散值来展开。不需要编写冗长的代码,vararg与spread的结合很和谐。
如果有一个数组,我们可以使用spread,但通常使用列表而不是数组。如果要传递一个值列表,则不能直接在列表上使用spread运算符。相反,必须将列表转换为所需类型的数组,然后使用spread。下面是一个例子:

如果列表中的元素和vararg的类型与Int不同,那么使用合适的List<T>的to…Array()方法将其转换为所需类型的数组。