【问题标题】:'public' function exposes its 'public/*package*/' parameter type SolarEdgeException'public' 函数暴露了它的 'public/*package*/' 参数类型 SolarEdgeException
【发布时间】:2019-07-31 06:27:51
【问题描述】:

我有以下 Java 和 Kotlin 类:

package nl.friesoft.solaredgenotifier;

class SolarEdgeException extends Exception {
    public SolarEdgeException(String s)  {
        super(s);
    }
}



package nl.friesoft.solaredgenotifier

class SiteStorage(context: Context): ISolarEdgeListener {
    override fun onError(site: Site?, exception: SolarEdgeException?) {
    }
}

我得到这个编译错误:

'public' 函数暴露了它的 'public/package/' 参数类型 SolarEdgeException

两个类都在同一个包中,为什么不能编译?

【问题讨论】:

    标签: java kotlin package class-visibility


    【解决方案1】:

    默认情况下,Kotlin 中的类是 public,因此每个成员/函数都暴露给外部世界。相反,在 Java 中,默认可见性,即省略可见性关键字,如 publicprotectedprivate,是 package-private

    SolarEdgeExceptionpackage-private,而它的用户SiteStorage 完全是public

    这意味着SiteStorage 的用户根本无法捕获或使用您的异常。


    不幸的是,Kotlin 没有 package-private 的概念,因为包的管理方式与 Java 不同。

    您可以拥有的最好的是internal,这意味着该定义对整个模块都是可见的。
    我想说,在这种情况下,将SolarEdgeException 设为public 类,将构造函数维护为package-private

    在 Kotlin 的 package-private 可见性上有一个论坛帖子,读起来很有趣。
    kotlin-to-support-package-protected-visibility

    【讨论】:

    • 如何解决这个问题?如何将 SiteStorage 包设为私有?
    • 我不确定它是否仍然正确;但从历史上看,Java 规范并没有强制要求包布局匹配目录布局,这是一个约定。
    • @Gavin 你是对的 Gavin,我已经习惯了 IDE 检查,以至于我的大脑将其视为编译器错误。我将删除那段文字。
    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多