标签: kotlin-null-safety

Kotlin 类型不匹配:必需 Array<Int?>? 但发现 Array<Int>

这是我的Foo数据类定义

data class Foo(
    var fooArg: Array<Int?>? = null, 
)
Run Code Online (Sandbox Code Playgroud)

这是对它的调用:

val bar: Array<Int> = arrayOf(1,2,3)
val foo = Foo(fooArg = bar)
Run Code Online (Sandbox Code Playgroud)

但这给出了一个错误type mismatch: required Array<Int?>? but found Array<Int>

我很困惑,它需要一个可为空的类型,而我为它提供了一个非空值,该类型如何不匹配?

nullable kotlin kotlin-null-safety

2
推荐指数
1
解决办法
2691
查看次数

为什么 null 安全很重要

我目前正在从 java 切换到 kotlin,不断出现的优点之一是 kotlin 是空安全的,默认情况下不能为变量或对象分配空值,但有一些方法可以分配空值。空值。但是我不确定为什么这有好处,Java 不安全会产生什么问题?

到目前为止,在线搜索仅给出了零安全是什么的描述,而不是为什么要实现零安全。提前致谢。

java kotlin kotlin-null-safety nullsafe null-safety

2
推荐指数
1
解决办法
463
查看次数

如果不为 null,则将值设置为构建器 - Kotlin

我是科特林新手。有人可以告诉我如何在下面的 cade 中仅当不为空时才设置该值。应该有一种方法可以使用 withlet()但我不知道该怎么做。

如果var2不为空,只有我应该设置它。否则会抛出空指针错误。

private fun myFunc(var1: Type1 , var2: Type2?) {
    
        val request = class1.newBuilder()
            .setType1(var1)
            .setType2(var2) // how to set var2 only if not null? 
            .build()
        clientClass.send(request)
 }
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-null-safety

2
推荐指数
1
解决办法
2296
查看次数

这是非常糟糕的练习使用!! 在kotlin?

最近有一些讨论是否!! 应该用在kotlin代码中.一种观点认为它根本不应该被使用,因为这对kotlin来说是一种不好的做法,并增加了崩溃的风险.

另一种意见感觉使用!! 只要你知道在任何已知条件下可以为空的数据都不应该是空的,这绝对不是一件坏事!在那里只是一个安全卫士(如果它出乎意料地变为零,它应该不会被捕获并引起关注,那么它肯定需要被调查).它不应该考虑使用!! 是一个崩溃的原因.

有没有人有意见或vor使用!! (不是盲目地使用它)?

下面两个示例,没有看到dataCount_2会更好,还是?

var data: List<Data>? = null  // it will be set before calling the two dataCount()

fun dataCount_1() : Int {
    return if (data!=null && data!!.isNotEmpty())  data!![0].count else 0
}

fun dataCount_2() : Int {

    data?.let { dataList ->
        if (dataList.isNotEmpty()) {
            return dataList[0].count ?: 0
        }
    }
    return 0
}
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-null-safety

1
推荐指数
1
解决办法
239
查看次数

Kotlin 中 Map of Map 中的括号表示法

在 Kotlin 中,可以对 Map 使用方括号表示法,因此以下代码:

  val mapOfMap: Map<String, Map<String, String>> = mapOf("Key1" to mapOf("Subkey1" to "Value1", "Subkey2" to "Value2"))
  println(mapOfMap["Key1"])
Run Code Online (Sandbox Code Playgroud)

印刷:

{Subkey1=Value1, Subkey2=Value2}
Run Code Online (Sandbox Code Playgroud)

那太棒了。但为什么我不能执行以下操作

println(mapOfMap["Key1"]["Subkey1"])
Run Code Online (Sandbox Code Playgroud)

它会导致编译错误:在 Map 类型的可空接收器上只允许安全 (?.) 或非空断言 (!!.) 调用?

处理这个问题的正确方法是什么?

hashmap kotlin kotlin-null-safety

1
推荐指数
1
解决办法
1792
查看次数

Kotlin 中 MutableMap 和 MutableList 的空安全性

我正在尝试运行这个例子

fun main() {
    val mlist: MutableList<String> = mutableListOf<String>()
    val mapp: MutableMap<Int, MutableList<String>> = mutableMapOf(1 to mlist)
    println(mapp)
    mapp[1].add("a") // Correct is mapp[1]?.add("a")
    println(mapp)
}
Run Code Online (Sandbox Code Playgroud)

在线 Kotlin 编译器

编译器正在抱怨 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type MutableList<String>?.

尽管我已经定义了MutableList<String>为什么编译器会说有关MutableList<String>?.

什么编译器比我更懂?!我在这里缺少什么?

kotlin kotlin-null-safety

1
推荐指数
1
解决办法
587
查看次数

是否在Kotlin中使用lister()将listOf()设置为null?

让我们f()返回一个可为空的值。

我想做的是,
如果f()为null,则获取一个空列表,
否则,如果f()不为null,则获取单个项目的列表value

在Scala中,我们可以执行以下操作:

Option(f()).toList
Run Code Online (Sandbox Code Playgroud)

或更详细地

Option(f()).map(v => List(v)).getOrElse(List.empty)
Run Code Online (Sandbox Code Playgroud)

在Kotlin中,没有Option(假设没有Funktionale库),在Scala中null toList()与(None: Option)没有不同。

我们有Elvis运算符,但在listOf()函数内部将为null ,因此它将为

listOf(f() ?: /* What can I do here? */)
Run Code Online (Sandbox Code Playgroud)

我们想要的null是listOf(/*no argument */),但是Elvis运算符需要一个参数,因此listOf(f() ?: )将导致编译错误。

至少我们可以做

val v = f()
if (v == null) listOf() else listOf(v)
Run Code Online (Sandbox Code Playgroud)

但它是两个衬里。

为此有一些表达吗?

我将在类的主要构造函数默认参数中使用此表达式,因此,如果它不是一个衬里,则将其括在方括号中,因此如下所示:

class A(
    val p1: List<V> = run {
        val v = f()
        if (v == null) listOf() …
Run Code Online (Sandbox Code Playgroud)

null option kotlin kotlin-null-safety

0
推荐指数
1
解决办法
328
查看次数

有什么区别!!和 ?在 kotlin 的空安全中?

我对以下实例中?和的用法有点困惑。!!

  lat = mLastLocation?.latitude.toString()
  longi = mLastLocation!!.longitude.toString()
Run Code Online (Sandbox Code Playgroud)

我应该使用哪个空安全运算符?

android kotlin kotlin-null-safety

0
推荐指数
1
解决办法
2737
查看次数

是 !!与?相同的事情。在科特林?

我已经用“!!”读过了 代替 ”?。” 在 kotlin 中不推荐。检查变量中是否为 null 时,两者有什么区别?

kotlin kotlin-null-safety

0
推荐指数
1
解决办法
97
查看次数

科特林。如何仅映射列表的非空值?

我需要对我的列表进行一些操作。

例如我有以下列表TestData

data class TestData (
    val value: Int?,
    val name: String
)
Run Code Online (Sandbox Code Playgroud)

我需要将列表映射TestData到列表String。这是我的代码:

 val names = listOfTestData
              .map { data -> getName(data.value) } <- Type mismatch. Required: Int, found Int?
              .distinct()
Run Code Online (Sandbox Code Playgroud)

问题是该函数getName(value: Int)仅接受不可为 null 的类型。我可以以某种方式跳过 null 的元素listOfTestDatavalue

我可以在制作地图之前过滤这些值,但我必须在地图内部使用!!,我想要一个更优雅的解决方案。

 val names = listOfTestData
                  .filter { it.value != null }
                  .map { data -> getName(data.value!!) } 
                  .distinct()
Run Code Online (Sandbox Code Playgroud)

请告诉我如何在不使用的情况下完成此操作!!

collections arraylist kotlin kotlin-extension kotlin-null-safety

0
推荐指数
1
解决办法
1215
查看次数