如何在Kotlin中实例化一个抽象类?

3 java android abstract-class kotlin

我想出了以下问题:

我的MainActivity代码:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        // ERROR: Cannot create instance of an abstract class
        var db = DataBase().getDataBase(this)
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

房间数据库:

@Database(entities = arrayOf(DataBaseUser::class), version = 1)
abstract class DataBase : RoomDatabase() {

    val DB_NAME : String = "DataBaseUser"
    private lateinit var INSTANCE : DataBase

    fun getDataBase(context: Context): DataBase {
        if (INSTANCE == null){
            INSTANCE = Room.databaseBuilder(context.applicationContext,DataBase::class.java,DB_NAME).build()
        }
        return INSTANCE
    }

    abstract fun getUserDao(): DataBaseUserDao
}
Run Code Online (Sandbox Code Playgroud)

我无法在Kotlin中实例化该类.在Java中,我这样做:

db = AppDataBase.getDataBase(view.getContext());
Run Code Online (Sandbox Code Playgroud)

如何在Kotlin中获得相同的结果?

Wil*_*zel 9

使用单例(在Kotlin中object)来保存Room数据库实例:

@Database(entities = arrayOf(DataBaseUser::class), version = 1)
abstract class DataBase : RoomDatabase() {
    abstract fun getUserDao(): DataBaseUserDao
}

object DatabaseProvider {
    val DB_NAME : String = "DataBaseUser"
    private lateinit var INSTANCE : DataBase

    fun getDataBase(context: Context): DataBase {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.applicationContext,DataBase::class.java,DB_NAME).build()
        }

        return INSTANCE
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

val db = DatabaseProvider.getDataBase(view.getContext())
Run Code Online (Sandbox Code Playgroud)