Как привести каждый элемент в Scala List? - PullRequest
8 голосов
/ 16 июня 2011

У меня есть API (из сторонней Java-библиотеки), который выглядит следующим образом:

public List<?> getByXPath(String xpathExpr)

, определенный для класса с именем DomNode

Я хочу сделать что-то вроде получения Scala List вкакой элемент относится к указанному типу:

val txtNodes: List[DomText] = node.getByXPath(xpath).toList

Но компилятор выдает ошибку: несоответствие типов.

Каково решение этой проблемы?

Ответы [ 2 ]

15 голосов
/ 16 июня 2011

Вам нужно привести каждый элемент списка, чтобы доказать, что все они имеют требуемый тип. Вы можете сделать это только во время итерации, например

node.getByXPath(xpath).map{case d: DomText => d}.toList

или

node.getByXPath(xpath).map(_.asInstanceOf[DomText]).toList

Какое из написанных актеров вам подходит.

Вы также можете привести список, node.getByXPath(xPath).toList.asInstanceOf[List[DomText]], но вы получите предупреждение, так как это приведение выполняется без какой-либо проверки из-за стирания типа (как в java).

11 голосов
/ 16 июня 2011

Начиная с Scala 2.8, вы можете использовать 'collect':

scala> "hi" :: 1 :: "world" :: 4 :: Nil collect {case s:String => s}
res13: List[String] = List(hi, world)

Источник: http://daily -scala.blogspot.com / 2010/04 / фильтр-с-flatmap-или-collect.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...