加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:25:02 所属栏目:安全 来源:网络整理
导读:是否有任何逻辑上的原因为null.asInstanceOf [某些CPS注释类型]无法编译? 有关上下文,请参阅this github issue thread. 解决方法 我想知道scala 2.9版本是否正在做正确的事情,即使它编译(我会尝试当我有机会).无论如何,在2.10.0中这个编译和工作: import s
是否有任何逻辑上的原因为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,但是没能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读