子类无法访问伴随对象方法

Companion object method not accessible from subclass

我正在尝试使用子class中的方法getInstance
知道为什么无法访问上述方法以及如何更改此代码以便我可以访问它吗?

出于好奇,此示例结构来自于尝试在 Android.

上子 class 房间数据库 class
open class SingletonHolder<out T: Any, in A>(creator: (A) -> T) {
    private var creator: ((A) -> T)? = creator
    @Volatile private var instance: T? = null

    fun getInstance(arg: A): T {
        val i = instance
        if (i != null) {
            return i
        }

        return synchronized(this) {
            val i2 = instance
            if (i2 != null) {
                i2
            } else {
                val created = creator!!(arg)
                instance = created
                creator = null
                created
            }
        }
    }
}

abstract class subclass(val par: Int): superclass(par) {
    abstract fun function1()
}

class subclass_Impl(val par1: Int): subclass(par1) {
    override fun function1() {
        Log.d("unused", "unused")
    }

    override fun f2() {
        Log.d("this is", "subclass Impl")
    }
}

abstract class superclass(val dummy: Int) {
    abstract fun f2()

    companion object : SingletonHolder<superclass, Int>( { Builder.build(it) } )
}

class superclass_Impl(val par: Int): superclass(par) {
    override fun f2() {
        Log.d("this is", "superclass_Impl")
    }
}

class Builder {
    companion object {
        fun build(par: Int): superclass_Impl {
            return superclass_Impl(par)
        }
    }
}

class test {
    fun test1() {
        superclass.getInstance(1).f2()
        subclass.getInstance(1).f2()  // getInstance is not visible ??
    }
}

SingletonHolder class 派生自 kotlin 中的惰性实现,并允许将参数传递给 creator 函数。 https://medium.com/@BladeCoder/kotlin-singletons-with-argument-194ef06edd9e

superclass 模仿 abstract class MyRoomDatabase : RoomDatabase() on Android,这将在运行时创建一个 sqlite 数据库的实例,建议作为单例实现。在我的例子中,这是在服务中。 superclass_Impl 将由房间库创建。

subclass 在我的例子中是 MyRoomDatabase 的子 class 并且存在于将连接到服务的客户端上。我正在尝试扩展它以添加仅供客户端使用的查询方法。 subclass_Impl 将由房间库创建。

很明显,您认为静态成员是在 java 中继承的,并且由于伴随对象是同一事物,我应该能够做到以下几点。

subclass.getInstance() // as in question, subclass is name of the class not its instance

抱歉,这是不允许的。伴随对象不是 java 的静态成员。 Kotlin 旨在成为一种您不需要此类结构的语言。所以不要尝试使用 kotlin 功能编写 java 代码。

如果你想像引用java的静态成员一样引用一个comapnion对象成员,那么你必须指定包含class的伴生对象的名称。你的情况

superclass.getInstance(1).f2()