java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用
我無法解決看似微不足道的問題。我的問題可能是缺乏對Kotlin語言的經(jīng)驗(yàn)(和理解)。不過,我將需要幫助。
我做了一個(gè)自定義類,其中包含一個(gè)自定義函數(shù)。看起來很簡單,但是當(dāng)我嘗試使用此功能時(shí),我一直收到"未解決的引用"錯(cuò)誤。
這段示例代碼再現(xiàn)了錯(cuò)誤:
abstract class Test {
private var test: Test? = null
fun getBla(): Test? {
return test
}
fun shout() {
println("Whaaaaa!")
}
}
fun main(args: Array) {
val tst = Test.getBla()
tst.shout()
}
錯(cuò)誤顯示為Unresolved reference: getBla
此類可能沒有太多意義,但它旨在模仿我在應(yīng)用程序中使用的實(shí)際類的結(jié)構(gòu)。
我覺得我在犯一個(gè)可怕的菜鳥錯(cuò)誤。我搜索了Stackoverflow和Kotlin文檔,但似乎找不到解決方案。
我通過簡單地替換" hello world"示例在try.kotlinlang.org上測試了上述代碼。
####編輯
恐怕我嘗試構(gòu)建的應(yīng)用程序的上下文可能畢竟很重要。我正在嘗試實(shí)現(xiàn)一個(gè)Room數(shù)據(jù)庫,但是我能找到的最清晰的教程是針對Java的,因此我試圖進(jìn)行翻譯,這使我遇到了麻煩。
這是我當(dāng)前正在關(guān)注的頁面:房間數(shù)據(jù)庫。
我需要將" Test"類設(shè)為單例,這就是" getBla()"的實(shí)際內(nèi)容所針對的。
為了解決實(shí)際問題,這是實(shí)際類現(xiàn)在的樣子:
@Database(entities = [(Box::class)], version = 1)
abstract class BoxRoomDatabase : RoomDatabase() {
abstract fun boxDao(): BoxDao
private var boxRoomDatabase: BoxRoomDatabase? = null
fun getDatabase(context: Context): BoxRoomDatabase? {
if (boxRoomDatabase == null) {
//Double colon allows to get the Java class instead of a KClass, which is not equivalent
synchronized(BoxRoomDatabase::class.java) {
boxRoomDatabase = Room.databaseBuilder(context.applicationContext,
BoxRoomDatabase::class.java,"box_database")
.build()
}
}
return boxRoomDatabase
}
}
因此BoxRoomDatabase必須是單例。問題來自將Java代碼自動(dòng)翻譯成Kotlin。看來這種情況有點(diǎn)太復(fù)雜了。我試圖通過搜索"科特林","單身"和"抽象方法"的各種組合來找到答案。最終,我偶然發(fā)現(xiàn)了這個(gè)博客:有論點(diǎn)的Kotlin單身人士。我需要的是一個(gè)單調(diào)的論點(diǎn),這顯然不是科特林要做的一件小事。該博客介紹了如何實(shí)現(xiàn)這種構(gòu)造。
現(xiàn)在,我的代碼至少可以編譯,如果它確實(shí)執(zhí)行了我想要的操作,我將在以后找到。我當(dāng)前的實(shí)現(xiàn)有點(diǎn)像這樣:
SingletonHolder.kt(構(gòu)建帶有參數(shù)的單例)
open class SingletonHolder(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
}
}
}
}
BoxRoomDatabase.kt
import android.arch.persistence.room.RoomDatabase
import android.arch.persistence.room.Database
import android.content.Context
import android.arch.persistence.room.Room
@Database(entities = [(Box::class)], version = 1)
abstract class BoxRoomDatabase : RoomDatabase() {
abstract fun boxDao(): BoxDao
private var boxRoomDatabase: BoxRoomDatabase? = null
companion object : SingletonHolder({
Room.databaseBuilder(it.applicationContext,
BoxRoomDatabase::class.java,"box_database")
.build()
})
}
BoxRepository.kt
class BoxRepository internal constructor(application: Application) {
private val mBoxDao: BoxDao
private val mAllBoxes: LiveData>
init {
mBoxDao = BoxRoomDatabase.getInstance(application).boxDao()
mAllBoxes = mBoxDao.getAllBoxes()
}
fun getAllBoxess(): LiveData> {
return mAllBoxes
}
fun insert(box: Box) {
InsertAsyncTask(mBoxDao).execute(box)
}
private class InsertAsyncTask internal constructor(private val mAsyncTaskDao: BoxDao) : AsyncTask() {
override fun doInBackground(vararg params: Box): Void? {
mAsyncTaskDao.insert(params[0])
return null
}
}
}
即使可以編譯,也可能不是執(zhí)行此操作的最佳方法。如果有人對上述代碼的結(jié)構(gòu)有任何輸入,請隨時(shí)分享您的輸入。
val tst = Test.getBla()
它可能表示您正在嘗試在Test.Companion上調(diào)用getBla(),這意味著您試圖將其作為靜態(tài)方法(Java)進(jìn)行調(diào)用。
abstract class Test {
companion object {
fun getBla(): Test? = ...
但是您并不想這樣做,所以您可能應(yīng)該實(shí)例化正在調(diào)用方法的類。 這是一個(gè)抽象類,因此您需要匿名實(shí)現(xiàn)。
fun main(args: Array) {
val test = object: Test() {}
val bla = test?.getBla()
bla?.shout()
}
從技術(shù)上講,您也不需要fun getBla(),因?yàn)槟梢詫傩耘c私有設(shè)置程序一起使用。
var bla: Test? = null
private set
現(xiàn)在您可以以
val bla = test.bla
謝謝。 我不明白為什么如果我只是簡單地嘗試調(diào)用存在于類" Test.getBla()"中的方法,那么"它可能說您試圖在Test.Companion上調(diào)用getBla()"。 也許你可以詳細(xì)說明? 同時(shí),我也繼續(xù)使用您的輸入進(jìn)行搜索,并且我可能已經(jīng)找到了針對我的特定實(shí)現(xiàn)的解決方案。 我即將發(fā)布更新。
您是在類的伴隨對象上而不是在類的實(shí)例上調(diào)用方法。 基本上,您希望將其稱為靜態(tài)方法(Java術(shù)語)
總結(jié)
以上是生活随笔為你收集整理的java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教师网络计算机研修日志,教师网络研修日志
- 下一篇: 什么是大数据,大数据到底应该如何学?