为什么使用Array的+:和padTo将得到结果作为ArraySeq

时间:2015-11-12 03:48:59

标签: scala

我的代码如下所示,我需要在递归结果之前添加h1

如果我将评论的行更改为getLCSArray(...).+:(h1),我会收到类型不匹配的构建错误。

我查看了Array的{​​{1}}的API文档,其结果也应该是+:。如果我使用Array将类型更改回toArray,则会收到错误“No ClassTag for G”。

我的Scala版本是2.10.6

所以我有两个问题:

  1. 为什么Array+:会返回padTo
  2. 如何使用通用类型ArraySeqArraySeq更改回Array
  3. G

    代码可以编译,但逻辑错误。

    error: type mismatch;
    [INFO]  found   : scala.collection.mutable.ArraySeq[G]
    [INFO]  required: Array[G]
    [INFO]                 case true => getLCSArray(a1.tail,a2.tail).+:(h1)
    [ERROR] one error found
    

1 个答案:

答案 0 :(得分:2)

您需要ClassTag来创建正确元素类型的新数组。

在ScalaDoc中,请参阅"完整签名"在方法文档下方,可以看到+:的结果取决于所选的CanBuildFrom隐式。 [use case]签名(首先出现)会让所有人感到困惑。

scala> :pa
// Entering paste mode (ctrl-D to finish)

def getLCSArray[G>:Equals : reflect.ClassTag](a1:Array[G],a2:Array[G]):Array[G]=
    (a1.isEmpty,a2.isEmpty) match {
    case (true,_) => a1
    case (_,true) => a2
    case (_,_)=>{
        val h1=a1.head
        val h2=a2.head
        h1 == h2 match {
            case true => h1 +: getLCSArray(a1.tail,a2.tail)
            case _ => longest(getLCSArray(a1.tail,a2),getLCSArray(a1,a2.tail))
        }

    }
}
def longest[G>:Equals](a1:Array[G],a2:Array[G]):Array[G]={
    val length1 = a1.length
    val length2 = a2.length
    length1 > length2 match {
        case true => a1
        case _ => a2
    }
}

// Exiting paste mode, now interpreting.

getLCSArray: [G >: Equals](a1: Array[G], a2: Array[G])(implicit evidence$1: scala.reflect.ClassTag[G])Array[G]
longest: [G >: Equals](a1: Array[G], a2: Array[G])Array[G]