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, это должно иметь меньший эффект (если есть), чем переключение на лямбды.