Как отбросить каждый элемент в списке 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