此代码:
val l1: List[String] = List("test") //> l1 : List[String] = List(test)
val l2: String = "test" //> l2 : String = test
def printVal(s: Any) = {
println(s)
} //> printVal: (s: Any)Unit
printVal(l1) //> List(test)
printVal(l2) //> test
按预期编译并运行。
如果我尝试类似的东西:
val arr: Array[((String, String), Double)] = Array((("1", "2"), 4.5))
//> arr : Array[((String, String), Double)] = Array(((1,2),4.5))
def printCol(arr: Array[Any]) = {
arr.foreach { case (e, i) => println(e + "," + i) }
} //> printCol: (arr: Array[Any])Unit
printCol(arr)
然后我收到编译时错误:
type mismatch; found : Array[((String, String), Double)] required: Array[Any] Note: ((String, String), Double) <:
any, but class array is invariant in type t. you may wish to investigate a wildcard type such as `_ <
由于[Tuple2,Double]
不是Any
是否可以重写函数printCol
,使其接受任何类型作为参数并打印集合值?
有点像? :
def printCol(arr: Array[((Any, Any) , (Any))]) = {
arr.foreach { case (e, i) => println(e + "," + i) }
}
答案 0 :(得分:1)
你可以试试这个:
def printCol[A,B,C](arr: Array[((A,B),C)]) = {
arr.foreach { case (e, i) => println(e + "," + i) }
}
然后根据您的使用情况随意添加约束,您可以这样做:
def printCol[A,B](arr: Array[((A,A),B)]) = {
arr.foreach { case (e, i) => println(e + "," + i) }
}
强制内部元组的两个元素具有相同的类型。
答案 1 :(得分:0)
问题是,在Java String[]
中无法直接将其分配给Object[]
类型的变量。 Scala必须遵守这条规则。
您可以轻松地重写代码:
val arr: Array[((String, String), Double)] = Array((("1", "2"), 4.5))
//|arr: Array[((String, String), Double)] = Array(((1,2),4.5))
def printCol(arr: Array[_]) = {
arr.foreach { case (e, i) => println(e + "," + i) }
}
//|printCol: printCol[](val arr: Array[_]) => Unit
printCol(arr)
//|(1,2),4.5
//|res0: Unit = ()
当您更改printCol
以使其接受Array[Any]
或Array[AnyRef]
时,您必须准确提供该类型。因此,您最好使用未指定的通用。