前言
在讲述问题前我们先了解下Java
和Kotlin
可见性修饰符。
Java可见性修饰符public
、protected
、default
(默认修饰符)、private
可见性如下:
修饰符\作用域 | 当前类 | 同一个包 | 同一个包继承类 | 不同包继承类 | 不同包 |
---|---|---|---|---|---|
public | ✓ | ✓ | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✓ | ✓ | ✗ |
default | ✓ | ✓ | ✓ | ✗ | ✗ |
private | ✓ | ✗ | ✗ | ✗ | ✗ |
Kotlin可见性修饰符public
(默认修饰符)、proteced
和private
和Java一致,区别在于Kotlin没有default
取而代之的是internal
;关于internal
修饰符,官方文档对于它的描述如下:
可见性修饰符internal
意味着该成员只在相同模块内可见。更具体地说,一个模块是编译在一起的一套 Kotlin 文件:
一个 IntelliJ IDEA 模块;
一个 Maven 项目;
一个 Gradle 源集(例外是 test 源集可以访问 main 的 internal 声明);
一次 Ant 任务执行所编译的一套文件
问题发现
在Kotlin中,默认修饰符是public
,整个项目可见;当你编写SDK打包成aar给其它开发者调用时,为了隐藏某个无需开放的类对象,使用internal
对整个类进行修饰。例如给某个中间类使用了internal
修饰符,那么继承了该类的子类只能使用也必须使用internal
或者private
进行修饰,无法使用public
进行修饰;而恰好这些子类你需要对外开放的话就很麻烦。
解决方案
简单的解决方法,将父类的修饰符修改为public
,然后将父类不开放的属性和函数使用internal
修饰
如果还想要有更进一步的解决方案,可以参考以下链接:
Does Kotlin support package protected visibility?
Package protected alternative in Kotlin
Provide package-private visibility modifier (or another scope reducing mechanism)