2017-09-05 117 views
0

当转换一个java代码到科特林,该是什么阵<T?>意味着

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

?将类型标记为可为空。在Kotlin中,您可以区分可以为null的类型和不可以的类型。 –

+0

T?是一个Kotlin可空类型,数组只是表示集合可以包含空值 –

+1

感谢您的解释,但不知道为什么问一个问题变得'-2',如果谁给它的话可以解释这会更有帮助。 – lannyf

回答

1
return arrayOfNulls<MyData>(0) 

什么这条线是指:

  • arrayOfNulls返回N个元素的(在你的情况下为零)的阵列,但与空
  • <MyData>填充它的数据类型是MyData,这是NOT nullable

因此,您创建一个数组,其值为null(即使大小为零)但DataType不是n ullable:

两种解决方案:

// 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) 
} 
1

Tgeneric?表示可以为空。在Kotlin中,您可以区分可以为null的类型和不可以的类型。

由于Java中的所有类型,除了原子者(intlongfloat ...)可以为空,你需要添加?运营商应对这种情况下也是如此。

2

arrayOfNulls返回对象的数组,与null值进行初始化。 '?'意味着该对象可能是null

1
  1. 您需要知道,在Kotlin中,每个类都可以使用两种变体:可为空或不可空的。例如,类String可以用于StringString?类型,前者意味着“不为空”,后者意味着“可空”。
  2. <>字符引入了“通用类型”,例如,对于Array<String>这意味着该阵列只能容纳String类型的对象,而Array<String?>意味着它可以容纳Stringnull的实例。
  3. 作为您利用arrayOfNulls函数的返回类型将是Array<MyData?>,这就是为什么编译器会抱怨:

inferred type is Array but Array was expected Blockquote

为了解决这个问题,你可以让你的函数返回null的版本,就像你已经做过的那样,或者你不使用arrayOfNulls,当你确定你不想在你的阵列中包含null

fun getDataArray(): Array<MyData?> { 
    return arrayOfNulls<MyData>(0) 
} 

fun getDataArray(): Array<MyData> { 
    return arrayOf<MyData>() 
}