我使用本书详尽地研究了使用协方差和反方差的编译规则:http ://www.cs.ucsb.edu/~benh/260/Programming-in-Scala.pdf (p 423-424)
我想出了一个不应根据规则编译的示例,尝试了它,实际上,由于协方差/反方差问题,它无法编译。但是,我看不出它不应该起作用的任何合乎逻辑的原因。因此,与 Java 中的 Array 相比,我认为,即使它已编译,您也无法实现任何非类型安全的行为。
class TypeTest[+U] {
def call(func: () => U): U = func()
}
object Main extends App {
val test: TypeTest[Number] = new TypeTest[Integer]
test.call(() => 3)
}
编译输出为:
Main.scala:2: error: covariant type U occurs in contravariant position in type () => U of value func
def call(func: () => U): U = func()
你能跟我说清楚吗?