Итерирование по списку Java, включающему обобщенные элементы Java <?> В Scala - PullRequest
0 голосов
/ 16 июня 2011

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

public List<?> getByXPath(String xpathExpr)

defined on a class called DomNode

Я пытаюсь это сделать в Scala:

node.getByXPath(xpath).toList.foreach {node: DomElement => 

   node.insertBefore(otherNode)   

}

Но я получаю ошибку компиляции на узле.getByXPath.ошибка: "несоответствие типов; найдено: (com.html.DomElement) => Требуется единица: (? 0) =>? где тип? 0"

Если я изменю его на:

node.getByXPath(xpath).toList.foreach {node => 

   node.insertBefore(otherNode)   

}

затем ошибка исчезает, но затем я получаю сообщение об ошибке в файле node.insertBefore (otherNode): «значение insertBefore не является членом? 0»

Каков ответ на эту проблему?

Ответы [ 2 ]

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

Сделайте это:

node.getByXPath(xpath).toList.foreach { 
    case node: DomElement => node.insertBefore(otherNode)   
}

Используя case, вы превратите его в функцию сопоставления с образцом.Если возвращается какой-либо не DomElement, вы получите исключение - вы можете добавить еще одно case совпадение для случая по умолчанию, чтобы обработать его, если это необходимо.

То, что вы не должны сделать это использовать asInstanceOf.Это отбрасывает любой тип безопасности практически без выгоды.

1 голос
/ 16 июня 2011

Тебе придется разыграть его.то есть

node.getByXPath(xpath).toList.foreach {node => 
   node.asInstanceOf[DomElement].insertBefore(otherNode)   
}

У вас возникнет та же проблема в Java, что и тип элементов List, неизвестно.

(я предполагаю, что каждый элемент на самом деле является DomElement)

РЕДАКТИРОВАТЬ:

Даниэль прав, есть лучший способ сделать это.Например, вы можете выбросить гораздо более приятное исключение (по сравнению с ClassCastException или MatchError).Например,

node.getByXPath(xpath).toList.foreach { 
    case node: DomElement => node.insertBefore(otherNode)  
    case _: => throw new Exception("Expecting a DomElement, got a " + node.getClass.getName)   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...