Java 无法从列表中强制转换<;节点>;列出<;元素>;

Java 无法从列表中强制转换<;节点>;列出<;元素>;,java,xpath,dom4j,Java,Xpath,Dom4j,各位。 我正在练习dom4j和Xpath,但遇到了一个问题 我正试图: List<Element> conList = (List<Element>)doc.selectNodes("//contact"); List-conList=(List)doc.selectNodes(//联系人); 但有一个错误: Cannot cast from List<Node> to List<Element> 无法从一个列表转换到另一个列表 代码在教学

各位。 我正在练习dom4j和Xpath,但遇到了一个问题

我正试图:

List<Element> conList = (List<Element>)doc.selectNodes("//contact");
List-conList=(List)doc.selectNodes(//联系人);
但有一个错误:

Cannot cast from List<Node> to List<Element>
无法从一个列表转换到另一个列表
代码在教学视频中似乎运行良好, 但在我的电脑里不工作

这是一种非法的行动吗? 我能用其他方法解决这个问题吗?
谢谢。

您不能用这种方式简单地用具体参数强制转换基于泛型的对象

实现目标的一个好方法是:

List<Element> conList = doc.selectNodes("//contact")
.stream()
.map(node->(Element)node)
.collect(Collectors.toList());
List-conList=doc.selectNodes(//联系人”)
.stream()
.map(节点->(元素)节点)
.collect(Collectors.toList());
请注意,对于不知道列表元素是否实际上是目标类或接口实例的一般情况,您可能希望通过筛选来断言这一点

List<Element> conList = doc.selectNodes("//contact")
.stream()
.filter(node->node instanceof Element)
.map(node->(Element)node)
.collect(Collectors.toList());
List-conList=doc.selectNodes(//联系人”)
.stream()
.filter(节点->元素的节点实例)
.map(节点->(元素)节点)
.collect(Collectors.toList());

这是一个令人沮丧的问题,因为您知道(从XPath表达式的语义来看),列表中的项目都是
元素的实例,但无法告诉Java编译器这一点。如果DOM4J的设计者想得更仔细一点,他们会将结果声明为
List可能重复而不是重复,这个问题是关于向上转换,这个问题是关于向下转换/缩小DOM4J 1.6.1 selectNodes()返回一个列表,在DOM4J 2.1.1中它返回一个列表,这意味着selectNodes()中的任何现有代码填充列表都不会编译,并且需要重新处理(例如,从节点到元素的向下转换),如果他只想处理元素,他仍然可以使用流的
.foreach
,也不需要创建列表的副本。不过,流可能会有更多的内部开销
for (Node n : doc.selectNodes("//contact")) {
   Element e = (Element)n;
   ...
}