日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。