我想当我在元素之后使用 arrayOf 构造函数时,我应该指定类型。
编译器需要知道每个值的类型——但它通常可以infer 它已经知道的类型。所以通常¹省略类型。
在这种情况下,编译器知道每个元素都是String,因此列表类型只能是String(或其超类型之一:String?、CharSequence、CharSequence?、@987654333 @、Comparable<String>?、Any 和 Any?)。所以它推断出最严格的有效类型:List<String>。
当然,您可以根据需要手动指定类型。 (例如,您可能希望稍后能够在数组中设置空值或其他非字符串值。) 实际上,在这种情况下,您可以通过两种方式来做到这一点。你可以为arrayOf()指定类型参数:
var capitals = arrayOf<Any?>("Tokyo", "Moscow", "Paris", "Washington", "Beijing")
或者您可以指定要分配给它的变量的类型²:
var capitals: Array<Any?> = arrayOf("Tokyo", "Moscow", "Paris", "Washington", "Beijing")
两者在这里具有相同的效果,尽管第一个可能更好。 (它更短,这总是好的! 而且,它可以扩展到更复杂的表达式。)
1:在某些情况下,明确指定类型是一种很好的做法,即使您不需要。例如:
2:第二个例子表明编译器在推断类型时使用了周围的上下文。如果它在推断arrayOf() 的类型参数时仅查看String 参数,那么这将给出Array<String> — 不能将其分配给Array<Any?> 变量,因为Array 不是covariant!
但是,正如language spec 所说:
表达式的类型不仅可以从它们的参数导出,还可以从它们的用法导出。