我有以下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
两个类都在同一个包中,那么为什么不编译呢?
答案 0 :(得分:2)
Kotlin中的类默认为public
,因此每个成员/函数都暴露于外部世界。相反,在Java中,默认可见性为public
,即省略了protected
,private
或package-private
之类的可见性关键字。
SolarEdgeException
是package-private
,而其用户SiteStorage
则完全是public
。
这意味着SiteStorage
的用户根本无法捕获或使用您的异常。
不幸的是,Kotlin没有package-private
的概念,因为软件包的管理方式与Java中不同。
最好拥有internal
,这意味着该定义对整个模块都是可见的。
在这种情况下,我想将SolarEdgeException
设为public
类,并将构造函数保持为package-private
。
关于package-private
可见性的Kotlin上有一个论坛主题,很有趣。
kotlin-to-support-package-protected-visibility