Tag: kotlin null safety

结合null安全性和assertNotNull

在测试中,我们通常使用assertNotNull ,但是它不能执行从可空类型到非可空类型的智能转换。 我必须写这样的东西: if (test == null) { Assert.fail("") return } 使用assertNotNull调用来执行智能转换是否是一种解决方法? 你如何处理?

为什么不安全的.run()调用在Kotlin的空值上工作正常?

我有以下代码片段: val foo: String? = null foo.run { println("foo") } 我在这里有一个可以为空的变量foo ,它实际上被设置为null然后是非安全的.run()调用。 当我运行代码片段时,尽管在null上调用run方法,我仍然可以打印出来。 这是为什么? 为什么没有NullPointerException ? 为什么编译器允许对一个可选值进行非安全调用? 如果我传递println(foo) ,我在控制台中得到了一个很好的null ,所以我认为foo实际上是null是安全的。

Kotlin如果不是空的

什么是最简洁的方式使用iff var不是null ? 我能想到的最好的是: arg?.let { with(it) { }}

什么是Kotlin双重轰炸

我使用Android Studio将Java转换为Kotlin。 在实例变量之后,我得到了双重爆炸。 什么是双重的,更重要的是这个记录在哪里? mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))

一个字段可以转换为非null版本本身?

我有一个数据类 data class MyModel(private val _data: MyData? = null) 而且我想确保我的数据只有在不为空时才可以访问,否则抛出。 我使用下面这是很好的。 fun getData(): MyData { return checkNotNull(_data) { "data shouldn't be null" } } 但是,如果我按照Kotlin数据类的Override getter遵循指南,下面的投诉我需要返回MyData? 而不是MyData val data = _data get(): MyData { return checkNotNull(field) { "data shouldn't be null" } } 是否真的返回时, field不能转换为非空的版本?

在可能为空的接收器类型的数组列表中,只允许安全或非空的确定的呼叫

刚开始使用kotlin进行android开发。我的arraylist被声明为这样 – var day1: ArrayList<DietPlanDetailModel>? = null 现在我试图通过它的位置访问一个元素 val dietPlan= day1[position] 但我正在编译时间错误, 在可能为空的接收器类型的数组列表中,只允许安全或非空的确定的呼叫 为什么我得到这个错误,我该如何解决?

Kotlin:不能同时应用两个条件检查“return body”函数样式

我有一个简单的函数检查是这样的: fun parseValidBluetoothBrickedId(controllerId: String?): Boolean{ if(controllerId != null){ if(controllerId.startsWith(BLUETOOTH_NAME_PREFIX) && controllerId.length > BLUETOOTH_NAME_PREFIX.length) return true } return false } 我想把它转换成简单的风格: fun parseValidBluetoothBrickedId(controllerId: String?) = controllerId?.length > BLUETOOTH_NAME_PREFIX.length && controllerId?.startsWith(BLUETOOTH_NAME_PREFIX) 但IDE(Android Studio 3.0 Beta7)给了我一个错误,强调大于('>')运算符: 操作符调用对应于这里不允许的点限定调用“controllerId?.length.compareTo(BLUETOOTH_NAME_PREFIX.length)” 此外,它强调作为一个错误线controllerId?.startsWith(BLUETOOTH_NAME_PREFIX),并说: 类型不匹配。 必需:布尔值,找到布尔值? 什么问题,真的吗? 这只是一个简单的方法,适用于第一块if-else样式。

当参数不可为空时,空值检查不会插入到实体类型中

TL; DR在生成代码时,具有特定类型的函数是否应该考虑类型参数的可空性? 测试用例 考虑下面的Kotlin代码; 两种方法的唯一区别是类型绑定是否为空( Any? )或不是( Any )。 @Test fun testNonNullableBound() { val x: Int = nonNullableBound() } @Test fun testNullableBound() { val x: Int = nullableBound() } private inline fun <reified T : Any> nonNullableBound(): T { return unsafeMethod() } private inline fun <reified T : Any?> nullableBound(): T { return unsafeMethod() } […]

如果对象为空,如何运行代码?

在Kotlin中,如果一个对象不为null,我可以运行代码: data?.let { … // execute this block if not null } 但如果对象为空,我怎么能执行一个代码块?

Kotlin对类属性无效

我怎样才能避免使用!! 为类的可选属性 class PostDetailsActivity { private var post: Post? = null fun test() { if (post != null) { postDetailsTitle.text = post.title // Error I have to still force using post!!.title postDetailsTitle.author = post.author Glide.with(this).load(post.featuredImage).into(postDetailsImage) } else { postDetailsTitle.text = "No title" postDetailsTitle.author = "Unknown author" Toast.makeText(this, resources.getText(R.string.post_error), Toast.LENGTH_LONG).show() } } } 我应该创建一个局部变量? 我想用!! 不是一个好的做法