7

我有以下 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

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

4

1 回答 1

9

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

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

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


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

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

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

于 2019-03-09T10:47:04.497 回答