微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala – 为什么null.asInstanceOf []失败?

是否有任何逻辑上的原因为null.asInstanceOf [<某些cps注释类型>]无法编译?

有关上下文,请参阅this github issue thread.

解决方法

我想知道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的值来创建一个简单的ControlContext [A,C],期望由A =>类型的继续k使用返回类型C的结果

在上面的例子“got”f [Object,String]中,continuation插件进一步用(x:Object)=>组成了普通的null值. “得到”x功能.

继续到context of the question,我看不出Defaultable [T]如何代表T @ cps [U],因为它只有一个类型参数.但是如果你增强了违约:

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](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,否则它将无法编译.我也试过实现A @ cpsParam [B,但是没能.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐