【发布时间】:2014-08-10 07:18:18
【问题描述】:
谁能告诉我为什么下面的代码无法编译,而 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);
【问题讨论】:
-
您尝试在您的
refreshLayerRenderables中使用BiPredicate<E, ? super Collection<R>>吗? -
你能附上完整的错误信息吗?
-
双谓词
> 也失败了。完整消息是“MissionDetailUIConst 类型未定义适用于此处的 updateNetworkNodeRenderable(E, Collection )” -
对于此类问题,始终建议包含有关编译器及其使用的版本的信息。或者,更好的是,使用不同的编译器进行测试并包含结果。
-
您应该包含
nodeMap的确切通用类型。无论如何,我尝试使用所有缺少的类型尽可能重现您的设置,并且编译器接受了所有三个版本而没有错误(好吧,在插入缺少的分号之后)。
标签: java generics java-8 type-inference ecj