传递Any作为函数参数

时间:2014-12-17 14:40:28

标签: scala

此代码:

  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) }
      }

2 个答案:

答案 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]时,您必须准确提供该类型。因此,您最好使用未指定的通用。