抽象関数/メソッドのタイプに基づいて、実装メソッドの正当な戻り値について効果的にアサーションを作成できるようになりました。以下のコンパイラの動作(ほとんど)は理にかなっていると直感的に感じますが、なぜそれを主張できるのかを明確に説明していただければ幸いです。
def f[T](t: T): T
恒等関数にすることしかできません(クラスEもコンパイルすることを除いて)。Tは有界ではないので何も知らないことは理解できますが、その説明にはギャップがあります。「foundscala.Int(42)requiredInt」を報告するコンパイラーは私を光に近づけていません。
trait A{ def f[T](t: T): T }
// compiles
class B extends A{ override def f[Int](t: Int): Int = t }
// does not compile
class C extends A{ override def f[Int](t: Int): Int = t + 1 }
// does not compile
class D extends A{ override def f[Int](t: Int): Int = 42 }
// compiles
class E extends A{ override def f[Int](t: Int): Int = 42.asInstanceOf[Int] }
// compiles
class F extends A{ override def f[Int](t: Int): Int = identity(t) }