Android 类型不匹配。必需:阵列<;Uri>;!找到:数组<;Uri?>;

Android 类型不匹配。必需:阵列<;Uri>;!找到:数组<;Uri?>;,android,kotlin,types,syntax,Android,Kotlin,Types,Syntax,?和语法在kotlin中非常混乱!我将值回调声明为我的活动的私有成员: private lateinit var mFilePathCallback: ValueCallback<Array<Uri>> 但当我尝试在活动结果中使用它时,如下所示: override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requ

语法在kotlin中非常混乱!我将值回调声明为我的活动的私有成员:

private lateinit var mFilePathCallback: ValueCallback<Array<Uri>>
但当我尝试在活动结果中使用它时,如下所示:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if(data != null && resultCode == Activity.RESULT_OK) {
        val resultsArray = arrayOfNulls<Uri>(1)
        resultsArray[0] = data.data
        mFilePathCallback.onReceiveValue(resultsArray)
        Log.d("ACTIVITY RESULT", data.data.toString())
    } else {
        Log.d("ACTIVITY RESULT", "Cannot get file path.")
    }
}
override-on-activityresult(请求代码:Int,结果代码:Int,数据:Intent?){
super.onActivityResult(请求代码、结果代码、数据)
if(数据!=null&&resultCode==Activity.RESULT\u确定){
val resultsArray=arrayOfNulls(1)
结果数组[0]=data.data
mFilePathCallback.onReceiveValue(结果数组)
Log.d(“活动结果”,data.data.toString())
}否则{
Log.d(“活动结果”,“无法获取文件路径”)
}
}

我在
onreceivevalue
函数调用中遇到以下错误:
类型不匹配。必需:数组!发现:数组
这太令人困惑了

语法在kotlin中非常混乱

它们并不混淆,两个符号都有不同的含义

要解释这两个符号:

让我们采取以下行动:

符号,称为

此符号的工作方式为可空。意味着当您尝试在Kotlin中赋值时

val myString : String? = null
区别

val myString : String = null // This will give Error So you have to put string with null value (e.g.[""]).
还有另一个符号并将其称为:

它的意思是不可为空

传递时,必须根据其数据类型传递值。意味着如果它要求字符串,您必须传递字符串

但当它收到空值或错误响应时

然后它会给你


如果您有任何疑问,请将其注释下来,我会为您清除。

我所要做的就是将结果数组转换为
数组

mFilePathCallback.onReceiveValue(结果数组作为数组)

  • arrayOfNulls(1)
    返回
    Array
    ,因为它的元素可以为null,并且一开始就为null

  • 将元素设置为
    resultsArray[0]=data.data
    不会更改类型(为什么会更改?)

  • 因此,您正在将一个
    数组
    传递给
    mFilePathCallback.onReceiveValue
    ,它需要一个
    数组
    (一个数组,其元素都是
    Uri
    ,不能为空)

  • 与您自己的答案中的强制转换不同,只需创建正确类型的数组即可开始:

    val uri = data.data
    if (uri != null) {
        val resultsArray = arrayOf<Uri>(uri)
        mFilePathCallback.onReceiveValue(resultsArray)
        Log.d("ACTIVITY RESULT", uri.toString()) // why toString?
    } else {
        // your original code doesn't cover this case
        // so decide what to do here
    }
    
    val uri=data.data
    if(uri!=null){
    val resultsArray=arrayOf(uri)
    mFilePathCallback.onReceiveValue(结果数组)
    Log.d(“活动结果”,uri.toString())//为什么要toString?
    }否则{
    //您的原始代码不包括此案例
    //所以决定在这里做什么
    }
    
    请注意,如果你只是这样做

    val resultsArray = arrayOf<Uri>(data.data)
    
    val resultsArray=arrayOf(data.data)
    

    理想情况下,您应该得到一个警告,因为
    data.data
    可以为空,但是。

    Kotlin对类型要求非常严格。同样,当您使用
    arrayOfNulls
    创建数组时,将创建一个
    数组

    可为null的类型可以包含该类型本身,但非null类型不能包含null。从
    Array
    Array?
    的转换对于一个实例来说很好。但是,由于泛型的差异,您不能将
    Array
    作为
    Array
    类型的参数传递。更多关于这个

    你需要一个
    数组
    是一种不能使用的特殊语法,但它表示对返回类型为或参数为未定义nullability类型的方法的平台调用。这里需要记住的重要一点是,您可以向它传递一个非null类型,或者为此传递一个可为null的类型<代码>
    只是意味着编译器不知道,因此它不会像通常那样严格执行空安全性

    例如,此方法:

    public void someMethod(String str) {}
    
    str
    参数解释为
    字符串在Kotlin中。添加
    @Nullable
    和它的
    String?
    ,或
    @NonNull
    和它的
    String

    关键点是,如前一链接中所述,该方法被解释为非空URI的潜在可空数组:

    Array   <Uri>                            !
    ^ Type  ^ Generic type (here: non-null)  ^ signifies the type (NOT the generic type) is potentially nullable (not normally useable)
    

    您可以使用前面提到的Alexey Romanov之类的语句—运行if-else语句检查数据是否为null,如果数据不为null,则使用
    arrayOf
    将其直接放入数组中。尽管如此,您仍然应该处理返回null的
    getData()
    ,即使您使用
    as
    方法

    只要把
    在数组的末尾。类似这样的
    数组@Ashish我到底把
    放在哪里了?@Ashish在哪里?你说的是哪个参数?@Ashish是的,我从那里删除了
    ,仍然是相同的错误:(请阅读答案。现在你明白了,它说你的一个uri是空的,这就是为什么它说
    数组
    。你错了。在这种情况下没有
    !!
    ——它是
    ,这是一个潜在的可空平台调用。它不是空安全性。
    不被称为安全的可空强制转换运算符。当在t结尾使用时。)type,它表示一个可空类型。当在
    as
    关键字末尾时,它是安全的可空强制转换运算符,如果强制转换失败,它将返回null。
    ?。
    是一个空安全调用,如果左侧为空,它不会调用右侧。不幸的是,对于从
    Array
    Array
    的强制转换的特定情况,
    as?
    是无用的,因为它们具有相同的擦除。它也是
    Array!
    ,而不是
    Array!
    ,这有点复杂(这就是为什么我在回复中添加了显式
    arrayOf
    )。错误包括'Array!
    ,这就是我为什么不这样做的原因。至于
    As?`,我没有在可空变量和不可空变量之间进行太多转换-为什么没有区别?在运行时转换数组类型时,数组类型没有空安全性吗?基本上是:1。
    xas?t
    减少为
    if(x是t)(
    
    Array   <Uri>                            !
    ^ Type  ^ Generic type (here: non-null)  ^ signifies the type (NOT the generic type) is potentially nullable (not normally useable)
    
    Returns
    URI          The URI of the data this intent is targeting or null.