Protected与Internal可见性修饰符哪个可见性更低?
Protected与Internal可见性修饰符的权限说明
这两个修饰符不存在绝对的谁更宽松、谁可见性更低的关系,二者的可见性判定维度完全独立,访问范围互不包含,这就是你写的两段测试代码全部触发编译错误的核心原因。
两个修饰符的具体访问边界如下:
internal:以编译模块作为访问边界,同一模块内的所有代码(无论是否和声明类存在继承关系)都可访问,模块外的所有代码(哪怕是声明类的子类)都无法访问。protected:以继承关系作为访问边界,声明类本身、以及声明类的所有子类(无论子类和声明类是否在同一个编译模块)都可访问,和声明类同模块但无继承关系的代码无法访问。
你碰到的报错本质是Kotlin对属性setter的硬性规则:setter的可见范围必须是属性本身可见范围的子集,也就是所有能调用setter的位置,必须保证一定能访问到对应的属性。但因为internal和protected的访问范围互不覆盖,两种写法都会出现逻辑矛盾:
- 对
internal var num配置protected set时:其他模块中的当前类子类,符合protected的访问要求可以调用setter,但它不在同模块内,根本访问不到internal修饰的属性本身,违反规则报错。 - 对
protected var num配置internal set时:同模块内和当前类无继承关系的代码,符合internal的访问要求可以调用setter,但它没有继承关系,根本访问不到protected修饰的属性本身,同样违反规则报错。
你可以自行验证:如果把上述两种写法的setter都改成private set,代码可以正常编译——因为private的可见范围仅限类内部,是internal和protected可见范围的共同真子集,完全符合setter的可见性约束。
内容的提问来源于stack exchange,提问作者Muhammad Hassaan
相关产品推荐
相关产品推荐

