You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同包下Kotlin重写方法暴露包级异常类引发编译错误排查

问题原因与解决方案

这个编译错误的核心是Java和Kotlin默认访问权限的差异导致的可见性冲突,我来给你拆解清楚:

1. 访问权限的本质差异

  • 在Java中,没有显式添加public修饰符的类(比如你的SolarEdgeException)默认是包级私有(package-private)——只有同一包内的代码能访问它。
  • 在Kotlin中,函数和类默认是public——意味着任何地方的代码都能调用这个函数。

2. 为什么报错?

你的Kotlin类SiteStorage中的onError方法是默认的public,它的参数列表里用了SolarEdgeException这个Java类。但SolarEdgeException是包级私有,可见性比public低。

Kotlin的编译器会严格检查:public的成员(函数、属性等)不能引用可见性比它低的类型。因为如果允许这样做,当外部包的代码调用这个public的onError方法时,根本找不到SolarEdgeException这个类型,这会导致运行时或编译时的访问错误。

3. 两种可行的解决方案

方案一:提升Java异常类的可见性

给Java的SolarEdgeException加上public修饰符,让它的可见性和Kotlin的public函数匹配:

package nl.friesoft.solaredgenotifier;
public class SolarEdgeException extends Exception {
    public SolarEdgeException(String s) {
        super(s);
    }
}

方案二:降低Kotlin函数的可见性

把Kotlin的onError方法的可见性改成internal(Kotlin里的internal表示模块内可见,和Java的包级私有在大多数场景下效果类似,如果你不需要这个方法被包外访问的话):

package nl.friesoft.solaredgenotifier

class SiteStorage(context: Context): ISolarEdgeListener {
    override internal fun onError(site: Site?, exception: SolarEdgeException?) {
    }
}

如果需要严格限制在同一包内(和Java包级私有完全对齐),可以结合@JvmPackagePrivate注解(需Kotlin 1.8+版本):

package nl.friesoft.solaredgenotifier

class SiteStorage(context: Context): ISolarEdgeListener {
    @JvmPackagePrivate
    override fun onError(site: Site?, exception: SolarEdgeException?) {
    }
}

内容的提问来源于stack exchange,提问作者Bart Friederichs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:10:50