2

この本を使用して、共分散と逆分散を使用するためのコンパイル規則を徹底的に研究しました: http://www.cs.ucsb.edu/~benh/260/Programming-in-Scala.pdf (p 423-424)

ルールに従ってコンパイルしてはならない例を思いつき、それを試してみましたが、実際、共分散/反分散の問題のためにコンパイルされません。ただし、機能しない論理的な理由はわかりません。したがって、たとえば Java の配列とは対照的に、コンパイルしたとしても型保証されていない動作を実現できなかったと思います。

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()

これをはっきりさせていただけますか?

4

1 に答える 1