结合内部类,存在类型,IndexedSeq和def时“对重载定义的模糊引用”

时间:2012-07-03 17:35:13

标签: scala

我有一些我无法编​​译的Scala代码,我把它简化为看似问题的本质。

class Inner[T] {
  class Value
  val values = IndexedSeq.empty[Value]
}

class Outer[T] {
  def inner = new Inner[T]
}

object TestApp {
  def main(args: Array[String]) {
    val outer: Outer[_] = null
    val values = outer.inner.values
    values(0)
  }
}

我正在使用2.9.1.final

$ scalac test.scala 
test.scala:14: error: ambiguous reference to overloaded definition,
both method apply in trait SeqLike of type ((idx: Int)Inner[_$1]#Value) forSome { type _$1 }
and  method apply in trait Function1 of type ((v1: Int)Inner[_$1]#Value) forSome { type _$1; type _$1; type _$1 }
match argument types (Int)
    values(0)
    ^
one error found

如果我执行以下任何操作,我可以使编译错误消失:

  • 删除内部类(IndexedSeq.empty[String]而不是IndexedSeq.empty[Value]
  • 删除存在类型(Outer[String]而非Outer[_]
  • 删除IndexedSeq.apply(values.head而非values(0)
  • def inner更改为val inner(这是最令人费解的)

不幸的是,在我的用例中,我无法改变其中的任何一个(在这个小例子中,为什么不明显,但实际的代码依赖于它们就是这样)。我做了一些禁止的事情,还是这是编译器的限制?

1 个答案:

答案 0 :(得分:1)

可能是一个限制,因为2.10.0-M4似乎很好。

当然,虽然NullPointer设置为outer,但它会提供null