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术语)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java正则表达式 分词_[Java]使用正则表达式实现分词

手工分词稍嫌麻烦,不好维护,而利用正则表达式就利索多了。Java提供了java.util.regex.Matcher,java.util.regex.Pattern类来帮助我们实现此功能。例一:以下程序将把"This is a farm that that raises dairy cattle."中的…

as和java什么关系_深入理解happens-before和as-if-serial语义

概述本文大部分整理自《Java并发编程的艺术》,温故而知新,加深对基础的理解程度。指令序列的重排序我们在编写代码的时候,通常自上而下编写,那么希望执行的顺序,理论上也是逐步串行执行,但是为了提高性能&a…

java产生字符函数_java生成字符串md5函数类(javaSE)

//实现生成MD5值import java.io.BufferedInputStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.securi…

java atomiclong 使用_Java并发AtomicLongArray类

全屏java.util.concurrent.atomic.AtomicLongArray类提供了可以原子读取和写入的底层long类型数组的操作,并且还包含高级原子操作。 AtomicLongArray支持对基础long类型数组变量的原子操作。 它具有获取和设置方法,如在变量上的读取和写入。 也就是说&am…

memcached client for java api,Memcached Client Forjava API

java_memcached-release 关键类及方法整理说明如下。 SockIOPool 这个类用来创建管理客户端和服务器通讯连接池,客户端主要的工作包括数据通讯、服务器定位、hash 码生成等都是由这个类完成的。 1.public static SockIOPool getInstance() 获得连接池的单态方…

对于JAVA的总结800字,java试用期转正工作总结500字

【www.gz85.com - 试用期工作总结500字】java试用期转正工作总结一年的时间,每当自己在总结它的时候,感觉是那么的短暂—弹指一挥间.而也就是在这一挥间,承载着太多太多,有收获与成就,有失败与不足.回头看看2012年的足迹,伴随着自己一年的是学习与坚持.2016年伊始是通过分销资源…

rtrim php,php rtrim() 格式化中文问题

先看以下代码var_dump(rtrim("互联网产品、", "、"));我们以为会得到结果 "互联网产品", 但实际上获得的是 ""互联网产��"为什么呢, 其实这是编码引起的问题.rtrim()这个函数在处理字符时是按照ascii编码来…

java gbk汉字 10进制,用java程序将GBK字符转成UTF-8编码格式

UTF-8 采用变长度字节来表示字符,理论上最多可以到 6 个字节长度(一个字符六个字节)。UTF-8 编码兼容了 ASC II(0-127), 也就是说 UTF-8 对于 ASC II 字符的编码是和 ASC II 一样的。对于超过一个字节长度的字符,才用以下编码规范&#xff1a…

我的世界java版刷雪球机,我的世界手机版怎么刷雪球 无限刷雪球机

随着全球变暖,厄尔尼诺现象加剧,一些生活在亚热带的孩子越来越感受不到下雪的喜悦,雪场的票子也是难求!不过不要着急,Minecraft给你模拟了一个生存的环境,在这里,你可以和好友联机打雪仗&#x…

php请求api获取返回值,我用curl请求接口获取返回值,但是不成功,大神给看看怎么调取?...

接口地址 http://mp.vservice.com.cn/service/OutWebService?wsdl接口调用方callService(String serviceName,String servId,String secretKey,String xmlInfo)参数名称 传值serviceName:OAuthservId :服务号idsecretKey :服务号秘钥xmlInfo…

对于单输入多输出系统matlab,求助!!如何把多输入多输出系统的传函转换为状态空间表达式?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这个对应的是单输入单输出的。多输入多输出的如下:% Thansfer multiple transfer functions into sate space modelsclcclear all;% Step1:输入传递函数分子分母系数%From u1 to y1num1[-0.0006086 -7.715e-…

matlab的fftn,matlab fftn

(X,m,n) fftn 进行 n 维快速傅立叶变换(反变换用 ifftn) 语法:Yffn(X) \\ Yfftn(X,siz) fftshift 快速傅立叶变换的 DC 组件移到光谱中心 语法:......(X,m,n) fftn 进行 n 维快速傅立叶变换(反变换用 ifftn) 语法:Yffn(X) \\ Yfftn(X,siz) fftshift 快速傅立叶变换的 DC 组件移…

php catch e是什么,php try catch 中的catch(Exception $e) 中的Exception 有什么作用?

首先很明确的是 try ... catch ... 是一个语言结构。那既然如此就不能用函数参数类型限定的方式去理解 catch 后面的括号里的 Exception 了。如果这里没有 Exception,比如这样写:try {} catch ($e) {}你会得到一个错误:Parse error: parse er…

java udp 心跳,udp简略通讯示例-心跳示例

当前位置:我的异常网 软件架构设计 udp简略通讯示例-心跳示例udp简略通讯示例-心跳示例www.myexceptions.net 网友分享于:2013-09-04 浏览:44次udp简单通讯示例---心跳示例//发送心跳new UDPToPointCenter(18056).start();public class UDPToPointCen…

php如何随机显示图片,php中随机显示图片的函数代码_php

/*********************************************** Filename : img.php* Author : freemousehttp://www.gaodaima.com/?p49284php中随机显示图片的函数代码_php* web : www.cnphp.info* email :freemouse1981gmail.com* Date : 2010/12/27* Usage:* * **********************…

php数组里面写路径,使用路径在PHP数组中进行递归搜索

我会尝试清理一下,但这有效:$needle ["chapter one", foo, bar];$array [["name" > "Intro","id" > "123","children" > ["name" > "foo","id" > &qu…

matlab时域分析论文,基于Matlab语言的数字信号时域相关性研究与分析.doc

摘要:针对在工程测试信号处理过程中广泛存在的信号之间的相关性问题,本文将研究和分析信号之间不同形式的相关关系以及信号在时域中的相关性。从而揭示了信号间关联程度的内在规律。通过举出实例来展示信号相关分析技术在实际工程中的具体应用。最后通过…

php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中

TL; DR:删除addslashes($data).这里多余.双重逃避..两次$datafread($p,filesize($fi));$dataaddslashes($data);$dat pg_escape_bytea($data);您读取数据,将其转义为字符串文字,然后将其转换为bytea八进制或十六进制转义.即使pg_escape_bytea是理智的,它也不会那样,…

页面显示其他php,php – 分页在所有其他页面上显示来自第1页的相同帖子

终于解决了这个:function my_filter_where( $where ) {global $wp_query;if (is_array($wp_query->query_vars[post_status])) {if (in_array(future,$wp_query->query_vars[post_status])) {// posts today into the future$where . " AND post_date …

oracle格式化列宽度,ORACLE日期时间的格式化参数大全

经常遇到有朋友问询关于日期时间格式化的问题(或可以通过格式化轻易解决),经过参考Oracle SQL Reference官方文档,并附上详细的应用示例综合成文,希望能够对大家学习和使用有所帮助。本篇可视为"oracle著名及非著名函数介绍"的补充…