AqD*_*AqD 5 java generics type-inference java-8 ecj
谁能告诉我为什么以下代码无法编译但 lambda 版本可以:
是否有关于泛型类型推断的规则?我应该避免什么?
EntityLayerManager.refreshLayerRenderables(
wwd, this.networkNodeShapeLayer, nodeMap.values(),
MissionDetailUIConst::createNetworkNodeRenderable,
MissionDetailUIConst::updateNetworkNodeRenderable) // <<== FAILED
Run Code Online (Sandbox Code Playgroud)
EntityLayerManager.refreshLayerRenderables(
wwd, this.networkNodeShapeLayer, nodeMap.values(),
MissionDetailUIConst::createNetworkNodeRenderable,
(e, coll) -> MissionDetailUIConst.updateNetworkNodeRenderable(e, coll));
Run Code Online (Sandbox Code Playgroud)
EntityLayerManager.<EwmsVwNetworkNodeEntity, KolladaRoot>refreshLayerRenderables(
wwd, this.networkNodeShapeLayer, nodeMap.values(),
MissionDetailUIConst::createNetworkNodeRenderable,
MissionDetailUIConst::updateNetworkNodeRenderable)
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
这是 Eclipse 的一个错误。我将其范围缩小到使用嵌套泛型参数 ( ) 作为引用方法(指定为)Collection<R>
的参数 (in ) 类型。它应该可以在 javac.exe 中正常编译。BiPredicate
Collection<KolladaRoot>
我想说坚持使用显式类型规范,直到它在 4.5 M2 中得到修复,它的影响(如果有的话)应该比切换到 lambda 更小。