【问题标题】:Is it possible to extend a package private class defined in a 3rd party jar in Scala是否可以扩展在 Scala 的 3rd 方 jar 中定义的包私有类
【发布时间】:2018-07-26 14:51:53
【问题描述】:

是否可以在 scala 中扩展在 3rd 方 jar 中定义的包私有类。因此,例如,如果我的代码所依赖的第 3 方 jar 具有类似这样的类

private [somepackage] A {

}

我可以在我的代码中以某种方式子类这个类吗?

谢谢

【问题讨论】:

  • 我猜你的意思是private [somepackage] class A?
  • 您可以在somepackage 中编写自己的代码来访问A 并将其公开以允许从您的主包访问它。但请注意,一旦 Scala 与 Java 9 模块系统一起使用,这将遇到麻烦。

标签: scala package-private


【解决方案1】:

不符合Scala 3rd Ed 中的编程,意译:

package a
package b {
  private[a] class B
}

包外的所有代码a无法访问类B

注意这里,包b在包a中。

奇怪的是,REPL 中似乎并非如此:请参阅 this post

【讨论】:

    【解决方案2】:

    不,你不能那样做。

    如果您需要它来存根/模拟它,请考虑使用代理来访问 A 类,并改为存根/模拟该代理类。例如,如果 A.doStuff 是您想要模拟/存根的,而 A.accessStuff 是您的代码中需要的,则创建一个类

    class ADecorated(underlying: A) {
      def doStuff() {
        underlying.doStuff()
        // whatever I want to do
      }
    
      def accessStuff() {
        x = underlying.accessStuff()
        // do something else and return
      }
     // Any other method you want to use
    }
    

    A.createA 的用法替换为新的ADecorated(A.createA())ADecorated 是您现在使用的对象

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 2019-03-05
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2011-07-27
      • 2011-04-03
      • 2013-05-20
      • 2016-01-06
      相关资源
      最近更新 更多