java - “public”函数公开其 'public/*package*/' 参数类型 SolarEdgeException

标签 java kotlin package class-visibility

我有以下 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' function exposes its 'public/package/' parameter type SolarEdgeException

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

最佳答案

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

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

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

<小时/>

不幸的是,Kotlin 没有包私有(private)的概念,因为包的管理方式与 Java 中不同。

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

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

关于java - “public”函数公开其 'public/*package*/' 参数类型 SolarEdgeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55076483/

相关文章:

java - 使用 Java 的 Selenium WebDriver(又名 Selenium2)中的 getPageSource()

java - kotlin:注释中数组的一些问题

java - 将 ByteBuffer 字段写入 Cassandra 时出现异常

java - Hibernate bag 与 idbag

php - 使用 String Request volley 传递数据在 Android Kotlin 中不起作用

generics - Kotlin 合约 : assert instance on reified type parameter

python - 超出相对导入中的顶级包错误

python 包装

r - 访问 R 包中的子目录

java - 使用 webAllowOthers 的 H2 控制台远程访问