日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時(shí)間:2025/3/15 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我無法解決看似微不足道的問題。我的問題可能是缺乏對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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。