栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

.forEach和.sort不起作用,无法在块中设置断点

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.forEach和.sort不起作用,无法在块中设置断点

此问题的根本原因是在

IndirectList
Eclipselink
JPA类中使用了错误的实现模式。(doc,source)在2.5版本家族中会发生此问题;它也可能在其他版本中出现。

问题在于,此类既是 子类

Vector
, 又具有 对
Vector
实例 的
引用。它尝试通过覆盖的所有方法来将所有方法调用委托给该实例
Vector
。只要没有添加新方法,此方法就可以正常工作
Vector
。

这发生在Java 8中。

Java的8增加了几个新 的默认方式 为

Collection
,
Iterable
和
List
接口,包括:

  • forEach
  • parallelStream
  • removeIf
  • replaceAll
  • sort
  • spliterator
  • stream

通常,添加默认方法是安全的,因为必须根据其他现有方法来实现它们。但是,出于效率考虑,实现类覆盖默认方法通常是一个好主意。Java 8

Vector
实现添加了这些默认方法的多个替代。如果您有实际
Vector
类的实例,则这些方法可以正常工作。本
IndirectList
类不重写这些方法,所以代表团路径,它试图建立不起作用了这些方法。而是使用普通的
Vector
实现。不幸的是,这些
IndirectList
方法不能使超类状态保持最新,因此
Vector
这些方法的实现都表现为好像
Vector
是空的。

Vector
覆盖
forEach
,
removeIf
,
replaceAll
,
sort
,和
spliterator
。在
parallelStream
与
stream
默认的方法是在以下方面实现的
spliterator
,于是同样的事情发生在他们身上。本质上,如果在
IndirectList
从Eclipselink
JPA检索的实现中使用集合上的新默认方法,则这些新方法都不起作用。

请注意,也会出现此问题

Collections.sort(indirectList)
。此方法仅调用该
indirectList.sort()
方法,因此遇到与上述完全相同的问题。

有关Eclipselink状态的更多信息,请参阅Eclipselink
JPA错误433075和446236。

有关此实现模式的陷阱的更多信息,请参见Joshua Bloch的书《 Effective Java,第二版 , 第16项:继承而不是继承》。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/497308.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号