https://kotlinlang.org logo
Title
e

Ellen Spertus

04/06/2020, 8:46 PM
I am adapting the Android Room with a View tutorial to my domain. As shown in the picture, I get an
Unresolved reference: Callback
error in the expression
ContactDatabase.Callback
. Why? As shown,
ContactDatabase
extends
RoomDatabase
, and
RoomDatabase.Callback
is defined.
@Database(entities = arrayOf(ContactEntity::class), version = 1)
abstract class ContactDatabase : RoomDatabase() {
    abstract fun contactDao(): ContactDao
    lateinit var callback: RoomDatabase.Callback

    private class ContactDatabaseCallback(
        private val scope: CoroutineScope
    ) : ContactDatabase.Callback() {  <-- Error on this line
t

tseisel

04/06/2020, 9:02 PM
I think you meant:
abstract class ContactDatabase : RoomDatabase() {
  [...]

  private class ContactDatabaseCallback(
    private val scope: CoroutineScope
  ) : RoomDatabase.Callback() { <-- Difference is here
  }
}
🥇 1
e

Ellen Spertus

04/06/2020, 9:02 PM
I discovered that removing the outer class name from the line with the error eliminates the error:
@Database(entities = arrayOf(ContactEntity::class), version = 1)
abstract class ContactDatabase : RoomDatabase() {
    abstract fun contactDao(): ContactDao
    lateinit var callback: RoomDatabase.Callback
    private class ContactDatabaseCallback(
        private val scope: CoroutineScope
    ) : Callback() { <-- No error here
How come?
Thank you, @tseisel. That was it.
t

tseisel

04/06/2020, 9:05 PM
For your 2nd question, because
ContactDatabase
extends from
RoomDatabase
, it can access its inner class
RoomDatabase.Callback
without specifying the full qualifier. That's a rather odd rule, probably inherited from Java.
e

Ellen Spertus

04/06/2020, 9:06 PM
@tseisel Why doesn’t
ContactDatabase.Callback
exist, when
ContactDatabase
extends
RoomDatabase
?
t

tseisel

04/06/2020, 9:07 PM
Inner classes definitions are not inherited. You have to define yours in `ContactDatabase
1
e

Ellen Spertus

04/06/2020, 9:07 PM
Thank you!