我的代码如下所示,我需要在递归结果之前添加h1
。
如果我将评论的行更改为getLCSArray(...).+:(h1)
,我会收到类型不匹配的构建错误。
我查看了Array
的{{1}}的API文档,其结果也应该是+:
。如果我使用Array
将类型更改回toArray
,则会收到错误“No ClassTag for G”。
我的Scala版本是2.10.6
所以我有两个问题:
Array
和+:
会返回padTo
?ArraySeq
将ArraySeq
更改回Array
?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
答案 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]