在Kotlin中定义数组类型

在Kotlin中定义数组类型,kotlin,Kotlin,我已经初始化了这样的字符串数组 var capitals = arrayOf("Tokyo","Moscow","Paris","Washington","Beijing") 但我没有将其类型指定为String。我想当我在元素之后使用arrayOf构造函数时,我应该指定类型 尝试下面的代码会给我预期的属性getter和setter带来错误 为什么我不能在括号内指定类型 var capitals

我已经初始化了这样的字符串数组

var capitals = arrayOf("Tokyo","Moscow","Paris","Washington","Beijing")
但我没有将其类型指定为String。我想当我在元素之后使用arrayOf构造函数时,我应该指定类型

尝试下面的代码会给我预期的属性getter和setter带来错误

为什么我不能在括号内指定类型

var capitals = arrayOf("Tokyo","Moscow","Paris","Washington","Beijing"):Array<String>
var capitals=arrayOf(“东京”、“莫斯科”、“巴黎”、“华盛顿”、“北京”):数组

您必须在变量声明之后指定类型,而不是在初始化之后:

var capitals:Array=arrayOf(“东京”、“莫斯科”、“巴黎”、“华盛顿”、“北京”)
也可以显式设置
数组的类型参数

var capitals = arrayOf<Any?>("Tokyo", "Moscow", "Paris", "Washington", "Beijing")
var capitals=arrayOf(“东京”、“莫斯科”、“巴黎”、“华盛顿”、“北京”)

您必须在变量声明之后指定类型,而不是在初始化之后:

var capitals:Array=arrayOf(“东京”、“莫斯科”、“巴黎”、“华盛顿”、“北京”)
也可以显式设置
数组的类型参数

var capitals = arrayOf<Any?>("Tokyo", "Moscow", "Paris", "Washington", "Beijing")
var capitals=arrayOf(“东京”、“莫斯科”、“巴黎”、“华盛顿”、“北京”)
我想当我在元素之后使用arrayOf构造函数时,我应该指定类型

编译器需要知道每个值的类型,但它通常可以根据它已经知道的类型来确定类型。  因此,省略类型是很常见的

在这种情况下,编译器知道每个元素都是
String
,因此列表类型只能是
String
(或其超类型之一:
String?
CharSequence
CharSequence?
Comparable
Any
Any
)。  因此,它推断出限制性最大的有效类型:
List

当然,如果需要,可以手动指定类型。  (例如,您可能希望以后能够在数组中设置null或其他非字符串值。)  事实上,在这种情况下,有两种方法可以做到这一点。  您可以为
arrayOf()
指定类型参数:

var capitals=arrayOf)。  如果您碰巧知道这一点,那么可以相应地指定可为null或不可为null的类型

  • 您可能有一个函数,它是公共API的一部分,您不希望由于某些内部更改而导致其类型间接更改。  (当然,这只是使用定义的函数的问题;除非返回类型,否则必须始终为指定类型。)


  • 2:第二个示例显示编译器在推断类型时使用周围的上下文。  如果它在推断
    arrayOf()
    的类型参数时只查看
    字符串
    参数,那么这将给出一个
    数组
    ——不能分配给
    数组

    但是,正如报告所说:

    表达式的类型不仅可以从它们的参数派生,还可以从它们的用法派生

    我想当我在元素之后使用arrayOf构造函数时,我应该指定类型

    编译器需要知道每个值的类型,但它通常可以根据它已经知道的类型来确定类型。  因此,省略类型是很常见的

    在这种情况下,编译器知道每个元素都是
    String
    ,因此列表类型只能是
    String
    (或其超类型之一:
    String?
    CharSequence
    CharSequence?
    Comparable
    Any
    Any
    )。  因此,它推断出限制性最大的有效类型:
    List

    当然,如果需要,可以手动指定类型。  (例如,您可能希望以后能够在数组中设置null或其他非字符串值。)  事实上,在这种情况下,有两种方法可以做到这一点。  您可以为
    arrayOf()
    指定类型参数:

    var capitals=arrayOf)。  如果您碰巧知道这一点,那么可以相应地指定可为null或不可为null的类型

  • 您可能有一个函数,它是公共API的一部分,您不希望由于某些内部更改而导致其类型间接更改。  (当然,这只是使用定义的函数的问题;除非返回类型,否则必须始终为指定类型。)


  • 2:第二个示例显示编译器在推断类型时使用周围的上下文。  如果它在推断
    arrayOf()
    的类型参数时只查看
    字符串
    参数,那么这将给出一个
    数组
    ——不能分配给
    数组

    但是,正如报告所说:

    表达式的类型不仅可以从它们的参数派生,还可以从它们的用法派生


    您还可以将
    作为
    关键字,通过以下方式指定您的类型:

    var capitals = arrayOf("Tokyo", "Moscow", "Paris", "Washington", "Beijing") as Array<String>
    
    var capitals=arrayOf(“东京”、“莫斯科”、“巴黎”、“华盛顿”、“北京”)作为数组
    
    您还可以通过以下方式将
    作为
    关键字指定为您的类型:

    var capitals = arrayOf("Tokyo", "Moscow", "Paris", "Washington", "Beijing") as Array<String>
    
    var capitals=arrayOf(“东京”、“莫斯科”、“巴黎”、“华盛顿”、“北京”)作为数组
    
    这只适用于此处,因为您正在强制转换为同一类型。  如果强制转换为其他类型,则会出现运行时错误(即时
    ClassCastException
    或更高版本的
    ArrayStoreException
    )。  (还有一个无关的
    )就是!如果您想使用不同的类型,您应该尝试将
    作为数组
    ,这对于所有kotlin类型都是无效的。  <代码>因为
    是一个强制转换,强制转换不会将值转换为所需的类型-它向编译器保证它已经是正确的类型。  在这种情况下,它不是!  <代码>数组
    在Kotlin中不是协变的(与Java不同),因此
    数组
    数组
    是不兼容的类型。  强制转换将给出运行时错误,或者尝试使用