Java 8 : generic type inference fails on method reference?

标签 java generics java-8 type-inference ecj

谁能告诉我为什么以下代码无法编译但 lambda 版本可以:

泛型类型推断有规则吗?有什么我应该避免的吗?

失败:

EntityLayerManager.refreshLayerRenderables(
        wwd, this.networkNodeShapeLayer, nodeMap.values(),
        MissionDetailUIConst::createNetworkNodeRenderable,
        MissionDetailUIConst::updateNetworkNodeRenderable) // <<== FAILED 

成功(使用正常的 lambda):

EntityLayerManager.refreshLayerRenderables(
        wwd, this.networkNodeShapeLayer, nodeMap.values(),
        MissionDetailUIConst::createNetworkNodeRenderable,
        (e, coll) -> MissionDetailUIConst.updateNetworkNodeRenderable(e, coll));

成功(指定泛型参数):

EntityLayerManager.<EwmsVwNetworkNodeEntity, KolladaRoot>refreshLayerRenderables(
        wwd, this.networkNodeShapeLayer, nodeMap.values(),
        MissionDetailUIConst::createNetworkNodeRenderable,
        MissionDetailUIConst::updateNetworkNodeRenderable)

引用方法:

public static <E, R extends Renderable> int refreshLayerRenderables(WorldWindow wwd,
        RenderableLayer renderableLayer, Collection<E> entityList,
        Function<E, ? extends Collection<? extends R>> createRenderables,
        BiPredicate<E, Collection<R>> updateRenderables);

public static Collection<KolladaRoot> createNetworkNodeRenderable(EwmsVwNetworkNodeEntity networkNode);

public static boolean updateNetworkNodeRenderable(EwmsVwNetworkNodeEntity networkNode, Collection<KolladaRoot> colladaRootCollection);

最佳答案

这是一个 Eclipse 错误。我 narrowed it down使用嵌套的泛型参数( Collection<R> )作为参数类型(在 BiPredicate 中)到引用的方法(指定为 Collection<KolladaRoot> )。它应该可以在 javac.exe 中正常编译。

我会说坚持显式类型规范直到它是 fixed in 4.5 M2 ,它的效果(如果有的话)应该比切换到 lambda 更小。

关于Java 8 : generic type inference fails on method reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226415/

相关文章:

Java:检查泛型是否为 int

Java 8 - 在字符串流上不同 - IllegalStateException

用于在列表中查找事件的 Java 流

java - 以编程方式嵌套布局

java - 光线转换以避免绘制看不见的面孔

java - JSF 输出脚本和 JavaScript 未被 EL 解析?

java - 如何在 Java 8 中展平 map 列表

java - JFrame 和 jpanel Action 监听器

java - 泛型和接口(interface)//我必须一起使用它们吗?

java - Java EE 中的 for-each 循环和泛型