Scala和Java Generics - 类型不匹配错误

时间:2016-01-02 19:49:35

标签: scala generics scala-generics

这种签名有一种方法:

public List<? extends TagNode> getElementListByName(String findName, boolean isRecursive) {
        return getElementList(new TagNodeNameCondition(findName), isRecursive);
}

在Scala中我使用了这样的方法:

val anchorNodes = bodyNode.getElementListByName("a", true)

并编写了一个函数来过滤掉所有带有此签名的锚标记:

def buildArticleLinksList(anchorTags: List[TagNode]): List[TagNode] = {
        @tailrec def buildArticlesList(articleLinksList: List[TagNode], anchorTags: List[TagNode]): List[TagNode] = anchorTags match {
            case Nil => articleLinksList
            case anchorTag :: tail if(anchorTag.getAttributeByName("href").contains(relativeCheckStr)) => buildArticlesList(articleLinksList:::List(anchorTag), tail)
        }

        buildArticlesList(List(), anchorTags)
}

但是我收到的错误说明如下:

Type mismatch, expected: List[TagNode], actual: List[_ <: TagNode]

有人可以解释一种方式让我声明我的函数,允许我实际传入的类型,这有点令人困惑。

1 个答案:

答案 0 :(得分:0)

将Java List转换为Scala列表并且已经有效。

修改

虽然我应该包含导入和代码,但一旦我更仔细地阅读错误,这是一个简单的修复。

要修复它,我基本上导入了JavaConverters,如下所示:

import scala.collection.JavaConverters._

然后我将Java List转换为Scala列表,如下所示:

val anchorNodes = bodyNode.getElementListByName("a", true).asScala.toList

这里的问题是asScala会将Java List映射到Scala等效的Buffer,因此我们可以将其转换为Scala List。