将java代码转换为Kotlin时,
public MayData[] getDataArray() {
return new MayData[0];
}
更改为
fun getDataArray(): Array<MyData> {
return arrayOfNulls<MyData>(0)
}
但是我收到了一个错误:
Error:(50, 16) Type mismatch: inferred type is Array<MyData?> but Array<MyData> was expected
它必须添加'?'
fun getDataArray(): Array<MyData?> {
return arrayOfNulls<MyData>(0)
}
“?”对模板类型意味着什么?
答案 0 :(得分:2)
arrayOfNulls
返回一个对象数组,初始化为null
个值。 '?'表示对象可能是null
。
答案 1 :(得分:1)
T
是generic。 ?
将类型标记为可为空。在Kotlin中,您可以区分可以为null的类型和不可以为null的类型。
由于在Java中除了原子类型(int
,long
,float
...)之外的所有类型都可以为null,因此需要添加?
运算符来处理也是这种情况。
答案 2 :(得分:1)
return arrayOfNulls<MyData>(0)
这一行意味着什么:
arrayOfNulls
返回N个元素的数组(在您的情况下为零),但填充为null <MyData>
数据类型为MyData
,不可为空因此,您创建一个具有null
值的数组(即使大小为零),但DataType不可为空:
两种解决方案:
// zero elements in the array but not nullable
fun getDataArray(): Array<MyData> {
return arrayOf()
}
// array with nullable data-type
fun getDataArray(): Array<MyData?> {
return arrayOfNulls<MyData?>(0)
}
答案 3 :(得分:1)
String
可用于String
或String?
类型,前者表示“非空”,后者表示“可空”。<>
字符引入了“通用类型”,例如对于Array<String>
这意味着,此数组只能保存String
类型的对象,而Array<String?>
表示它可以保存String
和null
的实例那个。arrayOfNulls
时,函数的返回类型将为Array<MyData?>
,这就是编译器抱怨的原因:推断类型是Array但是期望Array 块引用
为了解决这个问题,你可以让你的函数返回可以为空的版本,就像你已经做过的那样,或者当你确定不想包含arrayOfNulls
时你不使用null
在你的数组中。
fun getDataArray(): Array<MyData?> {
return arrayOfNulls<MyData>(0)
}
或
fun getDataArray(): Array<MyData> {
return arrayOf<MyData>()
}