NPE构造函数和超类

我有以下代码: public class CurrentPlayer(override val game: PewGame, spriteSheet: String) : Player(game, spriteSheet) 层次结构如下:CurrentPlayer – > class Player – > trait MovingEntity – > trait实体。 特质’实体’有一个场’val游戏:PewGame’。 Player的构造函数如下所示: public open class Player(override val game: PewGame, spriteSheet: String) : MovingEntity, InputAdapter() 在Player的构造函数中,如果你可以在kotlin中调用它,我可以这样做: this.sprite = CharacterSpriteSheet(Utilities.createTextureFromFile(spriteSheet), this.game.getSpriteBatch(), 0.25f) 问题是,’this.game’是null,因此’this.game.getSpriteBatch()’抛出一个NPE。 我不能以更好的方式解释这一点,所以任何帮助表示赞赏。 更确切地说,在使用调试器之后: 我可以在Player类中看到game和this 。 game不是null,但是this.game game是空的一些莫名其妙的原因。 感谢您的帮助! 编辑:我忘了提到,问题是只存在当我实例化CurrentPlayer时,并没有发生时,我实例化播放器。

如何显式调用一个对象的init块?

我有一个类似下面的类。 在第7行,我想直接调用init块,但是这似乎不可能没有使用reflection。 object MyClass { var editor: Editor = getDefaultEditor() set(value) { field = value //Todo: figure out how to avoid duplicating init block project = editor.project!! document = editor.document.charsSequence.toString().toLowerCase() findModel = FindManager.getInstance(project).findInFileModel.clone() findManager = FindManager.getInstance(project) } var project: Project var document: String var findModel: FindModel var findManager: FindManager init { project = editor.project!! document […]

Kotlin:如何懒惰启动一个向量

当我懒惰初始化一个向量。 我可以做到这一点正常的对象类如下。 val mPagerAdapter: PagerAdapter by lazy { PagerAdapter(supportFragmentManager, fragments, mTabsName) } 但是,当我懒惰初始化一个Vectorvariables如下 val fragments = Vector() by lazy { Vector() } 它给了我错误,说明Unresolve Reference: by 。 如何解决这个问题,我可以懒初始化呢?

在Kotlin中导入嵌套的对象/对象函数

比方说,我有, object Foo { object Moo { fun boo = 4 } } 我想通过在Scala中导入Foo来使用Moo,我会这样做: import Foo._ moo.boo 我怎么能在Kotlin做到这一点?

Kotlin:函数参数发送但不执行?

我有以下代码传入一个整数和两个函数。 choseNavigation(childPos, {Toast.makeText(ctx, “hello1”, Toast.LENGTH_SHORT).show()}, {Toast.makeText(ctx, “hello2”, Toast.LENGTH_SHORT).show()}) 函数定义如下: private fun choseNavigation(pos: Int, action1: () -> Unit, action2: () -> Unit) { when(pos) { 0-> { action1 Toast.makeText(ctx, “hello-again1”, Toast.LENGTH_SHORT).show() } 1->{ action2 Toast.makeText(ctx, “hello-again2”, Toast.LENGTH_SHORT).show() } } } 当我的childPost为0时,我希望它敬酒hello1和hello-again1 。 当它是1时,我希望它敬酒hello-again2 , hello-again2 。 但是,当我运行该函数时,它只会敬酒hello-again1或hello-again2 。 发送function根本没有被激活。 我错过了什么?

访问外部价值内适用

简短的例子: class MyClass { val someName = “want this value” val someOther = SomeOther().apply{ someName = someName } // other stuff below } SomeOther将它自己的someName值应用到someName ,所以value应用没有什么区别(x = x)。 问:如何访问外部someName ( “想要这个值” )在里面apply ? 更新我有进一步的疑虑相关的建议使用this.someName=someName ,下面2代码片断,第一个按预期工作,令人惊讶的是第二个失败与类似的行为描述。 第一 fun main(args: Array) { class SomeOther { var someName: String? = null } val someName = “want this value” print(SomeOther().apply […]

简化代码,除了签名以外,是相同的乐趣(可变参数vs地图)

我有一些非常相似的代码,我想知道是否有一种方法来简化它? fun parametersOf(vararg pairs: Pair): Parameters { val p = Parameters(pairs.size) for ((key, value) in pairs) when (value) { is String -> p.put(key, value) is Int -> p.put(key, value) is Double -> p.put(key, value) is Boolean -> p.put(key, value) else -> throw BBIllegalOperationException(“Unknown type for value:’$value’ of key:’$key'”) } return p } fun parametersOf(map: Map): […]

Kotlin惰性属性取决于init中初始化的另一个属性

我在Kotlin有以下课程: class Example { val name: String val lazyVar: String by lazy { name + ” something else” } init { name = “StackOverflow” } } 当我在lazyVar的lazy初始化块中使用name时(即使name在init块中被初始化),我得到以下错误: variables’name’必须被初始化 一个解决方案是用另一种方法初始化variables: class Example { val name: String val lazyVar: String by lazy { initLazyVar() } init { name = “StackOverflow” } private fun initLazyVar(): String { return […]

我怎样才能使用回报,而不是让Kotlin?

代码A来自https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/data/db/ForecastDb.kt 我希望使用return来代替let ,所以我写了Code B,但是Code B不能编译,我得到两个错误,为什么? 错误:(30,10)’return’在这里是不允许的 错误:(30,45)types不匹配:推断types是CityForecast? 但预计CityForecast 守则A override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use { val dailyRequest = “${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?” val dailyForecast = select(DayForecastTable.NAME) .whereSimple(dailyRequest, zipCode.toString(), date.toString()) .parseList { DayForecast(HashMap(it)) } val city = select(CityForecastTable.NAME) .whereSimple(“${CityForecastTable.ID} = ?”, zipCode.toString()) .parseOpt { CityForecast(HashMap(it), dailyForecast) } city?.let { dataMapper.convertToDomain(it) […]

从expression式中断或返回

我想做什么: when(transaction.state) { Transaction.Type.EXPIRED, //about 10 more types Transaction.Type.BLOCKED -> { if (transaction.type == Transaction.Type.BLOCKED && transaction.closeAnyway) { close(transaction) break //close if type is blocked and has ‘closeAnyway’ flag } //common logic } //other types } 我不能写break : ‘when’语句中不允许’break’和’continue’。 考虑使用标签来继续/从外部循环中断。 这是一种方式来return/break从when断言? 或者什么是解决它的最好方法?