0__*_*0__ 8 scala binary-compatibility package-private migration-manager
由于auxWindows下的包名称存在问题,我正在我的库的包层次结构中移动一个帮助器类
de.sciss.scalainterpreter.aux
Run Code Online (Sandbox Code Playgroud)
至
de.sciss.scalainterpreter
Run Code Online (Sandbox Code Playgroud)
该类是图书馆私有的,即private[scalainterpreter] object 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
Run Code Online (Sandbox Code Playgroud)
但我怀疑如果客户端代码没有调用任何一个对象,那么接口仍然是兼容的,因此我可以使用次要版本增加来指示更改,并允许这两个版本可以互换使用.
正确?
很容易看出内联如何破坏客户端代码,因为内联代码本质上会渗透到客户端界面中。这个例子确实要求出现链接错误;我们可以尝试做一些事情,比如 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?"
}
//}
}
Run Code Online (Sandbox Code Playgroud)
无辜旁观的客户示例:
package client
object Test {
import lib.Lib
def main(args: Array[String]) {
println(Lib.result)
}
}
Run Code Online (Sandbox Code Playgroud)
更改包私有类的包:
$ 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$
Run Code Online (Sandbox Code Playgroud)
Javap 展示了原因。[即,调用是内联的,但它仍然想要初始化模块。]
我没有关注这些讨论,但例如,有以下链接: https: //github.com/scala/scala/pull/1133 以及有关 ML 的其他讨论,了解关于二进制兼容性的期望是有效的。 https://groups.google.com/forum/?fromgroups=#!topic/scala-internals/sJ-xnWL_8PE