Как отбросить каждый элемент в списке Scala?

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

public List<?> getByXPath(String xpathExpr)

определен класс DomNode

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

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

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

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

2 ответов


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

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

или

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

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

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


начиная с 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/filter-with-flatmap-or-collect.html