5

谁能告诉我为什么以下代码无法编译但 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);
4

1 回答 1

4

这是一个 Eclipse 错误。我将其缩小到使用嵌套泛型参数 ( Collection<R>) 作为BiPredicate引用方法 (指定为) 的参数类型 (in Collection<KolladaRoot>)。它应该在 javac.exe 中编译得很好。

我会说坚持使用显式类型规范,直到它被固定在 4.5 M2中,它应该比切换到 lambdas 具有更少的效果(如果有的话)。

于 2014-08-14T16:39:29.357 回答