Java lang IllegaAccess通过HashBasedTable累加器收集番石榴不可变表
执行以下代码时出错 原因:java.lang.IllegalAccessError:尝试访问类 com.google.common.collect.AbstractTable from类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
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中生成结果”
- :“方法引用编译使用了不正确的限定类型”
javac
的编译器时,例如ECJ,您必须确保该编译器也是最新的
无论哪种情况,您都必须重新编译源代码,因为这是编译器的问题。但是,编译后的代码甚至可以与较旧的JRE一起使用
为了解释这个问题,通常情况下,调用应该使用接收方的编译时类型(或
静态
方法的显式类型)编码到字节码中,而不管实际方法实现的声明类型如何。因此,如果您有一个public
classa
从非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))
);