https://github.com/scala/scala/pull/3503
https://groups.google.com/d/topic/scala-internals/h8ztMqw-3Xg/discussion
https://github.com/scalaz/scalaz/pull/645
この場合にアップキャストという言い方が合ってるのかどうか知らないけど。
以下が、Scala2.10以前*1ではコンパイル通るが、2.11ではコンパイルエラーになることになったらしい
class C { private def foo = 0 def test(d: D) = d.foo // fooが呼び出せないというエラー } class D extends C
で、以下の様にするとコンパイル通るみたいですが
class C { private def foo = 0 def test(d: D) = (d: C).foo } class D extends C
これなんか気持ち悪いんですが、しょうがないのかなぁ。(議論長くて全部読んでない)
Javaではどうなってるんだっけ?と思ったら、Javaも2.11でのScalaと同じ挙動で、コンパイルエラーかな。うーん、そうなのか
*1:もっと詳しく言うと、2.11.0-M8以前