kotlin 建置错误:类型不匹配:推断类型为Unit

am46iovg  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(269)

我尝试连接一些条形码值:

barcodeScanner.process(image)
    .addOnSuccessListener {
        barcodes ->
            if (barcodes.isNotEmpty()) {
                val barcode = barcodes.reduce {acc, barcode -> acc + barcode.rawValue() }
                debug ("analyze: barcodes: $barcode")
            } else {
                debug ("analyze: No barcode scanned")
            }
    }

程式码会产生下列错误:

Type mismatch: inferred type is Unit but Barcode! was expected
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
public operator fun Offset.plus(offset: IntOffset): Offset defined in androidx.compose.ui.unit
public operator fun IntOffset.plus(offset: Offset): Offset defined in androidx.compose.ui.unit
Expression 'rawValue' of type 'String?' cannot be invoked as a function. The function 'invoke()' is not found

我一个都不懂。谁能解释一下吗?
特别是最后一条错误信息听起来很奇怪。为什么我要在String上调用rawValue呢?变量barcodes应该是List<Barcode>而不是List<String>

l7wslrjt

l7wslrjt1#

看一下reduce的函数原型:

inline fun <S, T : S> Array<out T>.reduce(
    operation: (acc: S, T) -> S
): S

operation的两个参数必须具有相同的类型,或者至少必须存在从第二个参数(即,条形码)到第一个参数(acc)的隐式转换。
这是必要的,因为reduce使用列表的第一个元素作为累加器的初始值。
在您的例子中,数组元素是Barcode,而累加器是String。您可能希望使用fold而不是reduce。使用fold,您可以自由选择累加器的类型,因为您显式指定了一个初始累加器值。在您的例子中,它将是空字符串。
另请参阅:Difference between fold and reduce in Kotlin, When to use which?

相关问题