无法理解在“Array[Any]”上带有“mkString”的 Scala 代码片段



我是探索scala的初学者。下面是一个 Scala 函数。

def printArray[K](array:Array[K]) = array.mkString("Array(" , ", " , ")") 
val array2 = Array("a", 2, true)  
printArray(array2) 

输出为数组(a, 2, true(

我的疑虑这里我们给出数组类型为 K。K是什么意思?它是否意味着所有类型?函数 'mkString' 如何能够将输出作为 Array(a, 2, true(。基本上我不明白串联部分。

感谢您的帮助。

调用

mkString方法

arr.mkString(prefix, separator, suffix)

将在所有数组元素上调用toString,在prefix前面,然后连接所有字符串,用separator分隔它们,最后附加suffix

printArray[K] 中的类型参数K将被忽略,它可以替换为存在参数。这只是一种名称不好和签名混乱的方法。

当您将任何基元数据类型(如Int(与扩展AnyRef的类型(如String(一起存储到同一数组中时,推断出最小上限为Any,因此在

printArray(array2) 

K设置为 Any ,并且mkString如上所述工作,粘合在一起

Array(          prefix
a               "a".toString
,               separator
2               2.toString
,               separator
true            true.toString
)               suffix

产生字符串Array(a,2,true) .

K在这里

不是一个类型,它是一个类型参数,为了更直观,请查看其他问题 scala 中的类型参数


在这个特定示例中,KAny推断 - 满足所有 3 个值的最具体类型 "a"2true

val array2: Array[Any] = Array("a", 2, true)  

mkString函数将所有集合项联接到单个字符串中。它在项目和开头和结尾添加分隔符和一些字符串。文档 mkString

如果你在 REPL 中查看你的array2定义,你会发现 array2 的类型是 Any 的,是 Scala 中所有其他类型的父类型

scala> val array2 = Array("a", 2, true)
//array2: Array[Any] = Array(a, 2, true) 

因此,当您调用函数时def printArray[K](array:Array[K]) = array.mkString("Array(" , ", " , ")") K现在被视为Any,它返回一个字符串,其中初始字符串为Array(结束字符串)所有值,分隔。

def mkString(start: String, sep: String, end: String): String = addString(new StringBuilder(), start, sep, end).toString

最新更新