Java lang IllegaAccess通过HashBasedTable累加器收集番石榴不可变表

Java lang IllegaAccess通过HashBasedTable累加器收集番石榴不可变表,java,java-8,guava,collectors,Java,Java 8,Guava,Collectors,执行以下代码时出错 原因:java.lang.IllegalAccessError:尝试访问类 com.google.common.collect.AbstractTable from类 Immutable.copyOf(listItemsToProcess.parallelStream()) .地图(项目-> ProcessorInstanceProvider.getInstance() .BuildImmutable(项目)) .collect(()->HashBasedTable.crea

执行以下代码时出错

原因:java.lang.IllegalAccessError:尝试访问类 com.google.common.collect.AbstractTable from类

Immutable.copyOf(listItemsToProcess.parallelStream())
.地图(项目->
ProcessorInstanceProvider.getInstance()
.BuildImmutable(项目))
.collect(()->HashBasedTable.create(),
HashBasedTable::putAll,
HashBasedTable::putAll)
);
使用Oracle的1.8 jre时出现错误-HashBasedTable::putAll


AbstractTable
在番石榴第15版中引入。看看你的类路径配置;您可能在运行时使用的是早期的库版本。

有趣的是,我用Lambda表达式替换了方法引用,结果成功了

    ImmutableTable.copyOf(itemList.parallelStream()
                    .map(item ->
                            ProcessorInstanceProvider.get()
                            .buildImmutableTable(item))
                    .collect(() -> HashBasedTable.create(),
                            (a, b) -> a.putAll(b),
                            (a, b) -> a.putAll(b))
                    );

这是一个编译器错误,相关报告如下

  • :“Javac编译方法引用,该引用允许在IllegalAccessError中生成结果”
  • :“方法引用编译使用了不正确的限定类型”
请注意,第一个报告的状态为“8u102中已修复”,因此下载可以解决此问题。当然,当使用非
javac
的编译器时,例如ECJ,您必须确保该编译器也是最新的

无论哪种情况,您都必须重新编译源代码,因为这是编译器的问题。但是,编译后的代码甚至可以与较旧的JRE一起使用


为了解释这个问题,通常情况下,调用应该使用接收方的编译时类型(或
静态
方法的显式类型)编码到字节码中,而不管实际方法实现的声明类型如何。因此,如果您有一个
public
class
a
从非
public
B
继承
public
方法
foo
,那么
a.foo
的调用应该编码为
a.foo
,而不是
B.foo
。对于普通的调用,编译器是这样工作的,但是对于方法引用,
javac
(以及afaik和ECJ的旧版本)无法正确执行。因此,当遇到一个类试图直接访问
B.foo
,而没有访问
B
,就会抛出
IllegalAccessError


它在使用lambda表达式时起作用,因为调用被编译成普通调用指令,编译器在合成方法中为其正确工作,并且在运行时构造函数接口实例时使用对该合成方法的引用。由于合成方法在同一个类中recides,因此它总是可以访问的。

它指向哪一行?在HashBasedTable::putAll上,修复的可能重复可能与有关,但您的JAR可能仍然不同步。另外,如果你不想被禁止,不要重复发布同一个问题。
    ImmutableTable.copyOf(itemList.parallelStream()
                    .map(item ->
                            ProcessorInstanceProvider.get()
                            .buildImmutableTable(item))
                    .collect(() -> HashBasedTable.create(),
                            (a, b) -> a.putAll(b),
                            (a, b) -> a.putAll(b))
                    );