Tag: 不可为空

有一个getter返回一个不可为空的类型,即使后台字段是可空的

num在设置时应该是可以为空的,但是它返回的值应该总是不可空的(有一个默认值)。 class Test { var num: Int? = null get() = field ?: 5 // default value if null } 即使返回的值总是非空,这对我来说是合理的,因为这种类型不是推断出来的,而是从后台字段中得到的: val a: Int = Test().num 类型不匹配:推断类型是Int? 但国际预期 问题是如何将该getter的返回类型更改为不可空? 如果我这样做,编译器说: Getter返回类型必须等于属性的类型,即“Int?” 我知道我可以用另一个属性numNotNullable (没有后台字段)解决它。 class Test { var num: Int? = null get() = field ?: 5 // default value if null val numNotNullable: Int get() […]

在Kotlin中,我如何习惯性地访问可空的嵌套地图值,或者返回一个默认值?

Quick Kotlin的最佳实践问题,因为我不能从文档中找到最好的方法。 假设我有下面的嵌套地图(为了这个问题的目的,明确指定了键入): val userWidgetCount: Map<String, Map<String, Int>> = mapOf( "rikbrown" to mapOf( "widgetTypeA" to 1, "widgetTypeB" to 2)) 下面的模式可以更简洁吗? fun getUserWidgetCount(username: String, widgetType: String): Int { return userWidgetCount[username]?.get(widgetType)?:0 } 换句话说,如果用户已知,并且他们有一个用于该窗口小部件类型的条目,则返回用户窗口小部件数量,否则为零。 特别是我看到我可以使用[]语法初始访问地图,但在使用?.之后,我看不到在第二级执行此操作的方法?. 。

Kotlin – 可空字段的非空吸气

我是Kotlin的新手,我尝试将一个小型的Java项目改为这种新的语言。 我在我的项目中使用mongodb,我有一个类,例如: class PlayerEntity { constructor() {} //for mongodb to create an instance constructor(id: ObjectId, name: String) { //used in code this.id = id this.name = name } @org.mongodb.morphia.annotations.Id var id: ObjectId? = null var name: String? = null } 我必须将id字段标记为空( var id: ObjectId? ),因为空的构造函数。 当我尝试从另一个类访问这个字段时,我必须使用非null检查: thePlayer.id!! 。 但是我的应用程序的逻辑是id字段永远不为null(mongo创建Player实例并立即设置id字段)。 而且我不想在任何地方进行非空的检查。 我试图做一个非null的getter,但它不能编译: var id: ObjectId? = […]

让Kotlin警告灵活/平台类型赋值为非空类型?

当从Kotlin调用一个不可为空注释的Java函数时,我们得到灵活类型的返回值,用感叹号表示,例如String! 。 Kotlin默默地允许将这些灵活的值分配给一个正常的非空类型,例如String ,在运行时可能会导致NullPointerException异常。 我宁愿为这样的任务得到编译器警告或错误。 或者,将平台类型视为等价于可空类型(例如String? )。 作为一个例子,用这个Java代码: import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.annotation.Nullable; public class NullTest { private String maybe() { if (SystemClock.elapsedRealtimeNanos() % 2 == 0) { return null; } return "ok"; } public String annotatedNothing() { return maybe(); } @Nullable public String annotatedNullable() { return maybe(); } @NonNull public String annotatedNonNull() { […]