欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2025/3/15 25 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。