为什么null.asInstanceOf [<some cps =“”annotated =“”type =“”>]失败?</some>

时间:2013-01-20 17:32:22

标签: scala continuations scala-2.10 continuation-passing

null.asInstanceOf[<some CPS annotated type>]无法编译的逻辑原因是什么?

有关背景信息,请参阅this github issue thread

1 个答案:

答案 0 :(得分:1)

我想知道scala 2.9版本是否正在做正确的事情,即使它编译了(我会在有机会的时候尝试)。无论如何,在2.10.0中编译和工作:

import scala.util.continuations._
object NullCPS extends App {
  def f[A,C] = shiftUnit[A,C,C](null.asInstanceOf[A])
  println(reset{"got " + f[Object, String]})  // prints: got null
  println(reset{"got " + f[Int, String]})     // got 0
  println(reset{"got " + f[Boolean, String]}) // got false   
}

shitUnit[A,B,C]是来自continuations package的库方法,它使用类型A的值来创建预期由类型{的连续符k使用的普通ControlContext[A,B,C] {1}}最终返回A=>B类型的结果。

在我上面的示例C中,continuation插件进一步使用"got " + f[Object, String]函数组成了普通的null值。

转到context of the question,我无法看到(x:Object) => "got " + x如何代表Defaultable[T],因为它只有一个类型参数。但是如果你增强T@cps[U]

Defaultable

注意:我必须使用import scala.util.continuations._ trait DefCPS[A,C] { def default: A@cps[C] } object NullCPS extends App { implicit def defaultCPS[A,C] = new DefCPS[A,C] { def default: A@cps[C] = shiftUnit[A,C,C](null.asInstanceOf[A]) } println(reset{"got " + implicitly[DefCPS[Object,String]].default}) println(reset{"got " + implicitly[DefCPS[Int,String]].default}) println(reset{"got " + implicitly[DefCPS[Boolean,String]].default}) } // prints got null // got 0 // got false 代替def,否则无法编译。我也试过实现val,但是没能。