洞穴夜莺
本帖最后由 洞穴夜莺 于 2021-7-16 09:17 编辑

某Mod在ecj下编译不通过,其原因如下
java.util.Map定义了java.util.Map.Entry
it.unimi.dsi.fastutil.longs.Long2ObjectMap继承了java.util.Map并定义了it.unimi.dsi.fastutil.longs.Long2ObjectMap.Entry
it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap继承了it.unimi.dsi.fastutil.longs.Long2ObjectMap
该Mod定义一变量类型为it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap.Entry,ecj认为是歧义引用而编译不通过,而javac则将其编译为it.unimi.dsi.fastutil.longs.Long2ObjectMap.Entry

请问在Java语言规范11版中,是否规定了此种引用应当如何处理?我应该给谁发issue?

版**:@dengyu @贺兰兰

ABlueCat
emm刚刚我试了我用的fastutil包是7.2版本的,这个版本并没有it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap.Entry这个接口,只有it.unimi.dsi.fastutil.longs.Long2ObjectMap.Entry
(这个问题让我有点迷糊)

洞穴夜莺
dengyu 发表于 2021-7-15 17:14
emm刚刚我试了我用的fastutil包是7.2版本的,这个版本并没有it.unimi.dsi.fastutil.longs.Long2ObjectLinke ...

本来就没有it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap.Entry这个接口

但是it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap继承it.unimi.dsi.fastutil.longs.Long2ObjectMap

他用it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap.Entry指代it.unimi.dsi.fastutil.longs.Long2ObjectMap.Entry,而实现的另一个接口java.util.Map中也存在一个Entry,这是否存在歧义?

ABlueCat
本帖最后由 dengyu 于 2021-7-15 18:19 编辑


(反编译仅用于研究使用)
it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap并没有继承it.unimi.dsi.fastutil.longs.Long2ObjectMap,如果必要请发源代码分析。
另,对于歧义的问题,一般使用完整的包名来指定你要引用的类



(虽然还是有点蒙)
(对了,我这“main”函数只是随便写的图一乐的方法,不是入口main函数)

洞穴夜莺
dengyu 发表于 2021-7-15 18:13
(反编译仅用于研究使用)
it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap并没有继承it.unimi ...

核心问题可以理解为
  1. import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
  2. ...
  3.         Long2ObjectLinkedOpenHashMap.Entry entry;
  4. ...
复制代码
在ecj编译错误Long2ObjectLinkedOpenHashMap.Entry歧义引用而在javac中编译通过,造成这种差异是谁的锅


至于你说的没有继承的问题,目前不在家,回头查查他用的什么版本的fastutil

洞穴夜莺
本帖最后由 洞穴夜莺 于 2021-7-15 22:58 编辑
dengyu 发表于 2021-7-15 18:13
(反编译仅用于研究使用)
it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap并没有继承it.unimi ...

fastutil8.2.2
梳理了一下这个类的继承情况如下(仅标注在源码中显式声明的继承关系)
所以说这个it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap确实是从java.util.Map和it.unimi.dsi.fastutil.longs.Long2ObjectMap各继承来了一个Entry成员类

ABlueCat
本帖最后由 dengyu 于 2021-7-15 23:36 编辑

以下测试使用的IntelliJ IDEA版本为2020.2.2 x64
eclipse版本为eclipse-java-luna-SR2-win32-x86_64
cache2k版本为cache2k-core-2.0.0.Final
fastutil版本为7.2.0



在测试那段代码时,发现在没有org.cache2k包的情况下,eclipse提示有歧义,提示需要“显式地导入包org.cache2k”,而该包并不是JRE系统库。


在网上下载cache2k包后,导入包,依然报错。


这说明eclipse不能分析准确类继承关系。

将代码使用IDEA编译后,发现IDEA能找到正确的Entry类(使用的是Long2ObjectMap.Entry类,正如你标记的那样)



那么结论也很显然了:eclipse并不能正常地分析出Entry类的继承关系,给出了错误的错误。
而你的另一个问题的答案也肯定是否定的,即没有歧义。我们使用的很明显就是最近一级的类。要使用祖先类,应该显示指明。
(话说所谓“歧义引用”的问题很少见,甚至网络上基本上没有相关资料,这次的问题是IDE本身的问题,与Java语言规范本身没有太大关系)

至于提issue,我建议给eclipse提,虽然我这里用的版本很老了,建议你看看最新版是否修复了bug,若没有就可以提了。