在 kotlin 中,如何从子类访问父类中受保护的静态成员

Posted

技术标签:

【中文标题】在 kotlin 中,如何从子类访问父类中受保护的静态成员【英文标题】:in kotlin, how to access protected static member in parent class from sub class 【发布时间】:2022-01-17 01:41:55 【问题描述】:

它是在 java 中工作的代码,但转换为 kotlin 后它无法编译。

有一个基类,它有一些定义为伴生对象中的静态受保护成员:

abstract class ParentClass 

   companion object 
        @JvmField
        final protected val SERVICE_TYPE_A = "the_service_type_a"    
   

和子类:

class ChildClass: ParentClass 
    public override fun getServiceType(): String 
        return SERVICE_TYPE_A. //<== got compile error
    

它无法编译。

如何从子类访问父类的静态受保护成员?

【问题讨论】:

【参考方案1】:

您需要改用@JvmStatic,如下所示:

abstract class ParentClass 
    companion object 
        @JvmStatic
        protected val SERVICE_TYPE_A = "the_service_type_a"
    

    abstract fun getServiceType(): String

SERVICE_TYPE_A 中的 final 关键字是多余的,因为在 Kotlin 中默认情况下所有内容都是 final。这也意味着如果你想扩展ParentClass,那么你需要将它显式定义为open

那么您的ChildClass 将如下所示:

class ChildClass: ParentClass() 
    override fun getServiceType(): String 
        return SERVICE_TYPE_A
    

【讨论】:

这似乎不起作用。 ParentClass 是简化示例(错过了 open 关键字),它实际上是一个抽象类,我更新了问题。 请避免过度简化问题,否则您会得到错误的答案。我已经根据更新的问题更新了我的答案。请检查它;) 感谢您的帮助。使用@JvmStatic 使其可编译,但也会在java 代码中生成protected final String getSERVICE_TYPE_A(),并在SERVICE_TYPE_A 被引用的地方得到错误IllegalAccessError: tried to access method com.xxx.ParentClass$Companion.getSERVICE_TYPE_A()。它可能需要一些重构才能使其工作(尤其是从 java 代码调用)。 但是你没有提到这应该在Java代码中使用。您提到您正在将 Java 转换为 Kotlin。我假设你所有的代码都是 Kotlin。

以上是关于在 kotlin 中,如何从子类访问父类中受保护的静态成员的主要内容,如果未能解决你的问题,请参考以下文章

如何影响派生类中受保护的基变量

子类从 Java 中的父类更改受保护的变量

无法访问kotlin子类中的父类变量

JavaSE8基础 同一个包下的子类,可以访问到父类中的 默认/受保护/公有方法

子类如何访问父类

我可以在 Java 中公开受保护的成员吗?我想从子类访问它