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



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

对于好奇的人来说,此示例结构来自尝试在 Android 上对 Room 数据库类进行子类化。

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类派生自 Kotlin 中的惰性实现,并允许将参数传递给 Creator 函数。 https://medium.com/@BladeCoder/kotlin-singletons-with-argument-194ef06edd9e

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

subclass在我的情况下是MyRoomDatabase的子类,位于将连接到服务的客户端上。我正在尝试扩展它以添加仅由客户端使用的查询方法。subclass_Impl将由房间库创建。

显然,您认为静态成员在 java 中是继承的,并且由于配套对象是一回事,我应该能够执行以下操作。

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

对不起,这是不允许的。伴随对象不是 Java 的静态成员。Kotlin 被设计成一种不需要这种结构的语言。所以不要尝试使用 kotlin 功能编写 java 代码。

如果要像引用 Java 的静态成员一样引用 Comapnion 对象成员,则必须指定包含伴随对象的类的名称。在您的情况下

superclass.getInstance(1).f2()

相关内容

  • 没有找到相关文章

最新更新