Dom4j: ошибка «несовместимые типы» при компиляции

#java #dom4j

#java #dom4j

Вопрос:

Я разрабатываю небольшое настольное приложение на Java. Я наткнулся на точку, где мне нужно прочитать данные из XML-файла, для этого я использую библиотеку Dom4j. Во время кодирования я сталкиваюсь со следующей ошибкой, может ли кто-нибудь помочь мне устранить эту ошибку:

 public void FromXML(String sXMLFileURI)
    {//Reads the XML File and Stroe Data in Calling Object
      Document document = getDocument( sXMLFileURI );
      String xPath = "myXpath";
      List<Node> nodes = document.selectNodes( xPath );//This line gives the followiing error:

//error "incompatible types
//required: java.util.List<org.dom4j.Node>
//found:    java.util.List<capture#1 of ? extends org.dom4j.Node>"
          for (Node node : nodes)
          {   
             //some processing here
          }
        }
  

Ответ №1:

Это следствие того факта, что общие коллекции java не являются «ковариантными». Метод SelectNodes() возвращает список объектов, все из которых реализуют узел. Но это не List<Node> . Вы должны изменить объявление на

 List<? extends Node> nodes=...
  

Ответ №2:

Поскольку сигнатура метода

 List<? extends Node> selectNodes(String)
  

ваша переменная nodes должна иметь тип List<? extends Node> , а не тип List<Node> .

A List<Node> принимает любой Node экземпляр в качестве элемента. Тогда как a List<? extends Node> — это a List<Node> , или a List<Element> , или a List<Attribute> , или список какого-либо другого подкласса Node . Вы просто не знаете, какой из них.