【问题标题】:Is there a solution to "Cannot access '<init>': it is private in XYZ?是否有解决“无法访问 '<init>':它在 XYZ 中是私有的?”的解决方案?
【发布时间】:2018-11-21 14:01:32
【问题描述】:

我包含了一个我想使用的库,但在访问其中一个类时,我收到了错误消息,

"无法访问'':它在[类名]中是私有的

我能做些什么来纠正这个问题,还是我只是坚持不使用这个包?

【问题讨论】:

  • 你能添加一些代码吗?
  • 删除 [class name] 中的 private 修饰符同时确保在将该库添加到您的 gradle 文件后执行“同步 Gradle”。
  • 我只有jar文件。
  • 如果这个类在一个 jar 中,那么你可以什么都不做,比如搜索另一种获取实例的方法,可能是静态 getInstance 方法,或者构建器。

标签: kotlin


【解决方案1】:

错误意味着构造函数是私有的。鉴于您的comment,我假设您正在使用库。如果是这种情况,您将不得不找到一种不同的方法来初始化它。一些库有类的工厂或构建器,因此请查找任何适用的文档(如果它是库或框架)。其他人也使用单例模式,或其他形式的初始化,您作为开发人员不直接使用构造函数。

但是,如果它是您的代码,请从构造函数中删除 private。如果它是internal,并且您尝试在模块外访问它,请删除internal。请记住,the default accessibility is public。或者,如果您想将构造函数保持为私有或内部,您可以使用构建器模式、工厂模式或任何类似的东西。

【讨论】:

  • 谢谢@Zoe 你怎么断定这个错误是由私有构造函数引起的?我想了解更多。
  • @Hatzil 因为这正是错误所说的。 init,表示此上下文中的构造函数,在 XYZ 中是私有的。
【解决方案2】:

我在尝试在另一个文件中扩展密封类时遇到了这个问题。如果没有看到库代码,很难知道这是否也是您正在尝试做的事情。

密封类具有以下独特功能:

  • 密封类可以有子类,但所有子类都必须在与密封类本身相同的文件中声明。

  • 密封类本身是抽象的,不能直接实例化,可以有抽象成员。

  • 密封类不允许有非私有的构造函数(它们的构造函数默认是私有的)。

  • 扩展密封类的子类(间接继承者)的类可以放在任何地方,不必放在同一个文件中。

欲了解更多信息,请阅读https://www.ericdecanini.com/2019/10/14/kotlins-sealed-class-enums-on-steroids/

希望这将帮助其他遇到此问题的 Kotlin 新手。

【讨论】:

  • 我的第一个独特功能解决了我的问题。我正在使用从密封类扩展的两个不同的数据类。但是我在不同的文件中定义了我的数据类。我看到了与这里定义的相同的问题。
【解决方案3】:

类构造函数默认是包私有的。只需在声明构造函数之前添加public 关键字即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2017-11-19
    相关资源
    最近更新 更多