Java 8: вывод обобщенного типа завершается ошибкой при ссылке на метод?

Может кто-нибудь сказать мне, почему следующий код не компилируется, но лямбда-версия делает:

Существуют ли правила относительно вывода обобщенных типов? Что мне следует избегать?

Не удалось:

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

Успех (с нормальной лямбдой):

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);

1 ответ

Решение

Это ошибка Eclipse. Я сузил его до использования вложенного универсального параметра (Collection<R>) как тип аргумента (в BiPredicate) к указанному методу (указан как Collection<KolladaRoot>). Он должен хорошо скомпилироваться в javac.exe.

Я бы сказал, придерживайтесь явной спецификации типов, пока она не будет исправлена ​​в 4.5 M2, это должно иметь меньший эффект (если есть), чем переключение на лямбды.

Другие вопросы по тегам