仅仅基于抽象函数/方法的类型,似乎可以有效地断言实现方法的合法返回值。我直觉地觉得(大部分)下面的编译器行为是有道理的,但我希望能清楚地解释为什么我应该能够断言
def f[T](t: T): T
只能是标识函数(除了 E 类也可以编译)。我可以理解我们对 T 一无所知,因为它是无限的,但这种解释存在差距。报告“发现 scala.Int(42) required Int”的编译器并没有让我更接近光明。
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) }