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