JVM零开销类型强制转换可行性及Scala Caprese项目适配问询
在Scala中模拟Caprese项目子结构类型系统的JVM限制问题
我正在评估在Scala中实现Caprese项目的技术难度与运行时影响。该项目旨在引入新的子结构类型系统,可在术语生命周期内混入/移除新能力,类似Rust的线性/仿射类型系统,编译器可追踪其使用/状态变化,在程序不同阶段启用/禁用方法。
我尝试用多个类型不同但运行时结构完全一致的术语模拟该能力,代码如下:
trait Cap trait Cap1 extends Cap { final def canDo(): Unit = { println("canDo") } } trait Cap2 extends Cap { // ...some other capabilities } class HasNoCap extends Cap // class HasCap1 extends HasNoCap with Cap1 val a = new HasNoCap val b = a.asInstanceOf[HasNoCap & Cap1] b.canDo()
遗憾的是,尽管HasNoCap和HasCap1的数据结构完全一致,这段代码在JVM中无法执行,报错如下:
Exception in thread "main" java.lang.ExceptionInInitializerError at com.tribbloids.spike.dotty.CapabilityTracking$.main(CapabilityTracking.scala:27) at com.tribbloids.spike.dotty.CapabilityTracking.main(CapabilityTracking.scala) Caused by: java.lang.ClassCastException: class com.tribbloids.spike.dotty.CapabilityTracking$ByDirectMixin$HasNoCap cannot be cast to class com.tribbloids.spike.dotty.CapabilityTracking$ByDirectMixin$Cap1 (com.tribbloids.spike.dotty.CapabilityTracking$ByDirectMixin$HasNoCap and com.tribbloids.spike.dotty.CapabilityTracking$ByDirectMixin$Cap1 are in unnamed module of loader 'app') at com.tribbloids.spike.dotty.CapabilityTracking$ByDirectMixin$.<clinit>(CapabilityTracking.scala:23) ... 2 more
目前看来只能依赖扩展方法,但据我了解扩展方法开销较高且可能不兼容方法重写。请问是否存在绕过该限制的方法?或是在当前JVM架构下根本无法实现?
内容的提问来源于stack exchange,提问作者tribbloid
相关产品推荐
相关产品推荐

