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.