关于Java:’public’函数公开其’public / * package * /’参数类型SolarEdgeException

'public' function exposes its 'public/*package*/' parameter type SolarEdgeException

我有以下Java和Kotlin类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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没有package-private的概念,因为软件包的管理方式与Java中不同。

internal是您最好的选择,这意味着整个模块都可以看到该定义。
我想说,在这种情况下,将SolarEdgeException设为public类,并将构造函数保持为package-private

关于Kotlin的package-private可见性,有一个论坛主题,这很有趣。 Kotlin支持包装受保护的可见性