【发布时间】:2015-11-25 11:44:09
【问题描述】:
编译器被重载的方法定义弄糊涂了,我找不到充分阐明我的意图的方法。
我有以下代码:
val part: (QueryParams) => List[ResultMap] = (partOf.find _).andThen(makeMap)
find 方法被重载:
def find(params: QueryParams): List[U] = ...
def find(params: QueryParams, flattener: U => T): List[T] = ...
只要有一个 find 的定义,代码就可以正常工作。由于我必须使用 2 个参数添加第二个 find 定义,因此编译器会生成此错误:
Error:(15, 31) ambiguous reference to overloaded definition,
both method find in trait DataFetcher of type (params: ...QueryParams)List[...Parser]
and method find in trait DataFetcher of type (params: ...QueryParams, flattener: ...Parser => ...ResultTuple)List[...ResultTuple]
match expected type ?
val part: Fetcher = (partOf.find _).andThen(makeMap)
^
恕我直言,没有歧义。 part 的类型被定义为接受一个QueryParams 类型的参数。只有一种方法接受单个QueryParams。 U 和 T 是不同的类型,makeMap 期望 List[U] 不涉及隐式、默认值或可变参数。
有没有办法向编译器进一步阐明我的意图?
编辑:消除歧义的一种方法是引入一个中间值,阐明 eta 扩展的预期类型:
val find: (QueryParams) => List[ResultTuple] = partOf.find _
val part: (QueryParams) => List[ResultMap] = find andThen makeMap
但由于makeMap 只接受List[ResultTuple],我仍然不明白所谓的歧义的原因,并且不想引入额外的价值。有什么说明吗?
【问题讨论】:
标签: scala compiler-errors overloading ambiguous