kev*_*rpe 6 java guava method-reference
演示失败的示例代码:
package ia.quant.nextgen.entry;
import com.google.common.collect.ArrayListMultimap;
import java.util.function.Consumer;
/**
* Created by arpeke on 2015-12-18.
*/
public final class SampleMain {
public static void main(String[] argArr) {
final ArrayListMultimap<Void, Void> arrayListMultimap = ArrayListMultimap.create();
arrayListMultimap.clear();
final Consumer<ArrayListMultimap> arrayListMultimapConsumer = ArrayListMultimap::clear;
arrayListMultimapConsumer.accept(arrayListMultimap);
}
}
Run Code Online (Sandbox Code Playgroud)
这是Error(不Exception)我看到的:
Exception in thread "main" java.lang.IllegalAccessError:
tried to access class com.google.common.collect.AbstractMapBasedMultimap
from class ia.quant.nextgen.entry.SampleMain
at ia.quant.nextgen.entry.SampleMain.lambda$main$1(SampleMain.java:17)
at ia.quant.nextgen.entry.SampleMain.main(SampleMain.java:18)
Run Code Online (Sandbox Code Playgroud)
我使用的是32位Java 8(v1.8.0_60)和Google Guava v19.0.我的Google-Fu告诉我Google Guice是根本原因,但缺乏可信的解释.(这是一个更大的项目的一部分,该项目还包括通过Apache Maven的Google Guice v3.0.)
示例参考:https://github.com/hierynomus/scannit/issues/7
有人知道吗...?
(最后,我也试过Google Guava v18.0,但没有运气.)
这段代码有效,但我不明白为什么.(我是否误解了非静态方法引用?)
final Consumer<ArrayListMultimap> arrayListMultimapConsumer = x -> x.clear();
arrayListMultimapConsumer.accept(arrayListMultimap);
Run Code Online (Sandbox Code Playgroud)
Lambda 需要找到方法的最后一个定义。因此,当您编写时ArrayListMultimap::clear,解释器实际上会尝试查找层次结构中的哪个类最后定义了该方法clear。碰巧该方法最后定义在 中AbstractMapBasedMultimap,它是一个包私有类。
目前的问题很可能出现在 JRE 中,但存在两种解决方法。
第一个就是你所描述的那个。第二种是 Guava 团队要么公开AbstractMapBasedMultimap要么重新定义clear()中的方法ArrayListMultimap(并且该方法只需要调用super.clear())。
目前对您而言,两种解决方法中最简单的一种就是您尝试过的一种。如果我是你,我仍然会要求 Guava 团队制定自己的解决方法,以免影响更多用户。
关于您的解决方法,它之所以有效,是因为您使用该方法而不是引用它。
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |