scala – 移动包私有类 – 我应该认为二进制不兼容吗?
发布时间:2020-12-16 08:53:47 所属栏目:安全 来源:网络整理
导读:由于在 Windows下包名称aux的问题,我正在我的库的包层次结构中移动一个帮助器类 de.sciss.scalainterpreter.aux 至 de.sciss.scalainterpreter 该类对库是私有的,即私有[scalainterpreter]对象Helper. 现在使用Typesafe Migration-Manager,显然它报告更改不
由于在
Windows下包名称aux的问题,我正在我的库的包层次结构中移动一个帮助器类
de.sciss.scalainterpreter.aux 至 de.sciss.scalainterpreter 该类对库是私有的,即私有[scalainterpreter]对象Helper. 现在使用Typesafe Migration-Manager,显然它报告更改不兼容: Found 2 binary incompatibiities =============================== * class de.sciss.scalainterpreter.aux.Helper does not have a correspondent in new version * object de.sciss.scalainterpreter.aux.Helper does not have a correspondent in new version 但我怀疑如果客户端代码没有调用任何一个对象,接口仍然是兼容的,因此我可以使用次要版本增加来指示更改,并允许这两个版本可互换使用. 正确? 解决方法
很容易看出内联如何破坏客户端代码,因为内联代码基本上会渗透到客户端界面中.这个例子确实要求链接错误;我们可以尝试和做像javap一样的事情grep Helper,但在某种程度上你必须让scalac完成它的工作.
package lib { object Lib { //import util.Helper @inline def result = Helper.help } //package util { private [lib] object Helper { @inline def help = "Does this help?" } //} } 无辜地吸引客户的样本: package client object Test { import lib.Lib def main(args: Array[String]) { println(Lib.result) } } 更改包私有类的包: $scala -cp "classes;target" client.Test Does this help? apm@halyard ~/tmp/taking-it-private $vi lib.scala apm@halyard ~/tmp/taking-it-private $rm -rf classes/* apm@halyard ~/tmp/taking-it-private $smalac -d classes -optimise lib.scala apm@halyard ~/tmp/taking-it-private $smala -cp "classes;target" client.Test java.lang.ClassNotFoundException: lib.util.Helper$ Javap说明了原因. [也就是说,调用是内联的,但它仍然想要初始化模块.] 我没有关注讨论,但是例如有以下链接: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |