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