【问题标题】:Java 8: generic type inference fails on method reference?Java 8:泛型类型推断在方法引用上失败?
【发布时间】:2014-08-10 07:18:18
【问题描述】:

谁能告诉我为什么下面的代码无法编译,而 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);

【问题讨论】:

  • 您尝试在您的refreshLayerRenderables 中使用BiPredicate&lt;E, ? super Collection&lt;R&gt;&gt; 吗?
  • 你能附上完整的错误信息吗?
  • 双谓词> 也失败了。完整消息是“MissionDetailUIConst 类型未定义适用于此处的 updateNetworkNodeRenderable(E, Collection)”
  • 对于此类问题,始终建议包含有关编译器及其使用的版本的信息。或者,更好的是,使用不同的编译器进行测试并包含结果。
  • 您应该包含nodeMap 的确切通用类型。无论如何,我尝试使用所有缺少的类型尽可能重现您的设置,并且编译器接受了所有三个版本而没有错误(好吧,在插入缺少的分号之后)。

标签: java generics java-8 type-inference ecj


【解决方案1】:

这是一个 Eclipse 错误。我narrowed it down 使用嵌套的泛型参数(Collection&lt;R&gt;)作为参数类型(在BiPredicate)到引用的方法(指定为Collection&lt;KolladaRoot&gt;)。它应该在 javac.exe 中编译良好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多