2

コンパイルできない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 innerval innerます(これは最も不可解なものです)

残念ながら、私のユースケースでは、これらのいずれも変更できません(この小さな例では理由は明らかではありませんが、実際のコードはそれらがそのようになっていることに依存しています)。私は禁止されていることをしていますか、それともこれはコンパイラの制限ですか?

4

1 に答える 1

1

で問題ないように見えるので、おそらく制限2.10.0-M4です。

もちろん、に設定されてNullPointerいるので、それはしかし与えます。outernull

于 2012-07-03T18:52:39.643 に答える