'public' 函数公开其 'public/*package*/' 参数类型 SolarEdgeException
'public' function exposes its 'public/*package*/' parameter type SolarEdgeException
我有以下 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
,所以每个 member/function 都暴露给外部世界。相反,在 Java 中,省略可见性关键字(例如 public
、protected
或 private
的默认可见性是 package-private
.
SolarEdgeException
是 package-private
,而它的用户 SiteStorage
完全是 public
.
这意味着 SiteStorage
的用户根本无法捕获或使用您的异常。
不幸的是,Kotlin 没有 package-private
的概念,因为包的管理方式与 Java.
不同
最好的是internal
,这意味着定义对整个模块可见。
我会说,在这种情况下,将 SolarEdgeException
设为 public
class,将构造函数维护为 package-private
.
有一个关于 package-private
Kotlin 可见性的论坛帖子,读起来很有趣。
kotlin-to-support-package-protected-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
,所以每个 member/function 都暴露给外部世界。相反,在 Java 中,省略可见性关键字(例如 public
、protected
或 private
的默认可见性是 package-private
.
SolarEdgeException
是 package-private
,而它的用户 SiteStorage
完全是 public
.
这意味着 SiteStorage
的用户根本无法捕获或使用您的异常。
不幸的是,Kotlin 没有 package-private
的概念,因为包的管理方式与 Java.
最好的是internal
,这意味着定义对整个模块可见。
我会说,在这种情况下,将 SolarEdgeException
设为 public
class,将构造函数维护为 package-private
.
有一个关于 package-private
Kotlin 可见性的论坛帖子,读起来很有趣。
kotlin-to-support-package-protected-visibility