Scala 和 Java 泛型 - 类型不匹配错误
Scala and Java Generics - Type Mismatch Error
有一个带有此签名的方法:
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]
有人可以为我解释一种方法来声明允许我实际传入的类型的函数吗,这有点令人困惑。
将 Java 列表转换为适用于 Scala 的列表,并且成功了。
编辑
虽然我应该包括导入和代码,但在我更仔细地阅读错误后,它很容易修复。
为了修复它,我基本上导入了 Java 转换器,如下所示:
import scala.collection.JavaConverters._
然后我将 Java 列表转换为 Scala 列表,如下所示:
val anchorNodes = bodyNode.getElementListByName("a", true).asScala.toList
这里的事情是 asScala
会将 Java List 映射到一个 Buffer,它是 Scala 的等效项,因此我们可以将其转换为 Scala List。
有一个带有此签名的方法:
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]
有人可以为我解释一种方法来声明允许我实际传入的类型的函数吗,这有点令人困惑。
将 Java 列表转换为适用于 Scala 的列表,并且成功了。
编辑
虽然我应该包括导入和代码,但在我更仔细地阅读错误后,它很容易修复。
为了修复它,我基本上导入了 Java 转换器,如下所示:
import scala.collection.JavaConverters._
然后我将 Java 列表转换为 Scala 列表,如下所示:
val anchorNodes = bodyNode.getElementListByName("a", true).asScala.toList
这里的事情是 asScala
会将 Java List 映射到一个 Buffer,它是 Scala 的等效项,因此我们可以将其转换为 Scala List。