java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用
我無法解決看似微不足道的問題。我的問題可能是缺乏對Kotlin語言的經驗(和理解)。不過,我將需要幫助。
我做了一個自定義類,其中包含一個自定義函數。看起來很簡單,但是當我嘗試使用此功能時,我一直收到"未解決的引用"錯誤。
這段示例代碼再現了錯誤:
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()
}
錯誤顯示為Unresolved reference: getBla
此類可能沒有太多意義,但它旨在模仿我在應用程序中使用的實際類的結構。
我覺得我在犯一個可怕的菜鳥錯誤。我搜索了Stackoverflow和Kotlin文檔,但似乎找不到解決方案。
我通過簡單地替換" hello world"示例在try.kotlinlang.org上測試了上述代碼。
####編輯
恐怕我嘗試構建的應用程序的上下文可能畢竟很重要。我正在嘗試實現一個Room數據庫,但是我能找到的最清晰的教程是針對Java的,因此我試圖進行翻譯,這使我遇到了麻煩。
這是我當前正在關注的頁面:房間數據庫。
我需要將" Test"類設為單例,這就是" getBla()"的實際內容所針對的。
為了解決實際問題,這是實際類現在的樣子:
@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代碼自動翻譯成Kotlin。看來這種情況有點太復雜了。我試圖通過搜索"科特林","單身"和"抽象方法"的各種組合來找到答案。最終,我偶然發現了這個博客:有論點的Kotlin單身人士。我需要的是一個單調的論點,這顯然不是科特林要做的一件小事。該博客介紹了如何實現這種構造。
現在,我的代碼至少可以編譯,如果它確實執行了我想要的操作,我將在以后找到。我當前的實現有點像這樣:
SingletonHolder.kt(構建帶有參數的單例)
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
}
}
}
即使可以編譯,也可能不是執行此操作的最佳方法。如果有人對上述代碼的結構有任何輸入,請隨時分享您的輸入。
val tst = Test.getBla()
它可能表示您正在嘗試在Test.Companion上調用getBla(),這意味著您試圖將其作為靜態方法(Java)進行調用。
abstract class Test {
companion object {
fun getBla(): Test? = ...
但是您并不想這樣做,所以您可能應該實例化正在調用方法的類。 這是一個抽象類,因此您需要匿名實現。
fun main(args: Array) {
val test = object: Test() {}
val bla = test?.getBla()
bla?.shout()
}
從技術上講,您也不需要fun getBla(),因為您可以將屬性與私有設置程序一起使用。
var bla: Test? = null
private set
現在您可以以
val bla = test.bla
謝謝。 我不明白為什么如果我只是簡單地嘗試調用存在于類" Test.getBla()"中的方法,那么"它可能說您試圖在Test.Companion上調用getBla()"。 也許你可以詳細說明? 同時,我也繼續使用您的輸入進行搜索,并且我可能已經找到了針對我的特定實現的解決方案。 我即將發布更新。
您是在類的伴隨對象上而不是在類的實例上調用方法。 基本上,您希望將其稱為靜態方法(Java術語)
總結
以上是生活随笔為你收集整理的java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教师网络计算机研修日志,教师网络研修日志
- 下一篇: 什么是大数据,大数据到底应该如何学?