我在我继承的一些代码中看到了一个有趣的行为,其中有一个带有依赖项 jar 的项目,其中存在一个与项目中的类同名且位于同一包中的类:
Eclipse 项目:
src/com.abc.d.E
依赖于XYZ.jar,其中存在com.abc.d.E.class
只是好奇这个设置在 Java 中是否合法。根据 Eclipse 的说法,它不会将其标记为错误,并允许创建一个新类来隐藏依赖项 jar 中的现有类,除非尝试在工作区中重命名此类现有类 - 然后它会产生以下警告:
"Binary references to a refactored element have been found. They will not be updated, which may lead to problems if you proceed."
然后就允许这种前向重构。但是,如果想要向后重构为冲突的名称,Eclipse 中会出现以下消息:
"Type named 'E' already exists in package 'com.abc.d'
原来如此
- 正确的 Java
- Eclipse 行为中允许的不一致或
- .Eclipse 错误?
谢谢。
最佳答案
如果同一个类加载器可以访问这两个类(例如,如果两个 jar 文件都位于同一个类路径上),则只会加载其中一个(可能是列表中的第一个),这将导致各种令人讨厌的结果,特别是如果它们的行为不一样。
假设库 1 使用 E.frobnicate()
,而库 2 期望有一个 E.frob()
方法:其中一个将获得 NoSuchMethodError
并且通常会严重失败。
一般来说,包名和类名应该唯一标识一个类。如果情况不再如此,那么您就会遇到麻烦。
只要您不需要从同一个类加载器访问这两个库,您就可以解决该问题,然后 JVM 就可以很好地处理它(因为 FQCN plus em> 类加载器由 JVM 内部使用,以在运行时唯一标识一个类)。
故意这样做的唯一情况是某个库以二进制兼容的方式重新实现了另一个库的类。请参阅log4j-over-slf4j举个例子。
关于java - Java中不同部署单元中相同包中同名的类是否会发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770522/