Kotlin调用RoomDB.getInstance提示未解析引用是什么原因?
问题背景
在Android Studio平台使用Kotlin开发Room数据库组件时,出现如下异常:编写代码阶段IDE智能补全可以正常提示getInstance方法,但代码编写完成后提示该方法未解析引用。
复现代码如下:
- 继承自
RoomDatabase的抽象类RoomDB定义:
abstract class RoomDB : RoomDatabase() { fun getInstance(context:Context) : RoomDB { // either finds an existing database or makes a new one // returns the database } }
- MainActivity中的初始化逻辑:
import android.example.app.Database.RoomDB class MainActivity : AppCompatActivity() { lateinit var database:RoomDB override fun onCreate(savedInstanceState: Bundle?) { database = RoomDB.getInstance(this) } }
错误根因
getInstance被定义为RoomDB抽象类的普通成员方法,这类方法必须依托类的实例对象才能调用,不支持直接通过类名访问。RoomDB是抽象类,本身无法直接实例化,代码中RoomDB.getInstance(this)的写法是将该方法作为类级别的静态方法调用,编译器无法匹配到对应的方法定义,因此抛出未解析引用错误。- 编写阶段的智能补全提示是IDE索引缓存异常导致的误判,不代表语法层面合法。
修复方式
将getInstance方法移入companion object伴随对象中,实现类名直接调用的效果,参考标准Room单例实现如下:
abstract class RoomDB : RoomDatabase() { companion object { @Volatile private var instance: RoomDB? = null fun getInstance(context: Context): RoomDB { return instance ?: synchronized(this) { val dbInstance = Room.databaseBuilder( context.applicationContext, RoomDB::class.java, "your_db_name" // 替换为自定义数据库名 ).build() instance = dbInstance dbInstance } } } }
修改完成后,原MainActivity中的RoomDB.getInstance(this)调用即可正常编译运行。
内容的提问来源于stack exchange,提问作者Randy
相关产品推荐
相关产品推荐

