Kotlin中的数组声明是否可以通过初始化来实现大小?

时间:2019-06-28 18:31:55

标签: arrays kotlin

我没有找到如何在 Kotlin 中声明没有预定义大小的数组的方法。

这可以:

lateinit var v:Array<Int>

但是我想人们不能在数组类型中放入大小说明。

如果需要指定尺寸。必须要做的:

var v2:Array<Int> = Array<Int>(2){5}

在这种情况下,向量的所有元素都等于5

下面是一个带有类和数组的示例:

data class But(
    val fufo: Int=0,
    val tp: Int = 1 
)  
typealias  ArBut = Array<But>
data class CArray (
   var arrayC: ArBut = ArBut(2){But()}
)    
val a =   CArray(arrayOf(But(2,2),But(5,4),But(3,3)))
println(a.arrayC[2])

有效!有趣的是,初始化不是类型的一部分,您可以将任何大小的数组放入类中,而无需进行边界检查。如果大小是类型规范的一部分,则将有所不同。

现在以矩阵为例。请注意,语法有点复杂。

data class CMatr (
   val matrC: Array<ArBut>  = Array<ArBut>(2){ArBut(0){But()}}
)    
 val m =   CMatr(arrayOf( arrayOf(But(2,2),But(5,4)),   
         arrayOf(But(-2,2),But(3,4)), arrayOf(But(1,1),But(5,3))  ))
 println(m.matrC[2][1])  // Also works! 

是否无法将大小放入数组类型规范中,或者我缺少什么?

3 个答案:

答案 0 :(得分:3)

用于基本类型:

这就是您的操作方式。而不是使用IntArray之类的kotlin内置函数,而是使用// Array of integers of a size of N val arr = IntArray(N) // Array of integers of a size of N initialized with a default value of 2 val arr = IntArray(N) { 2 }

的构造函数

这是示例:

val cars: Array<Car?> = arrayOfNulls(N) 
//returns an array of nullable Car objects with null values and size of N

用于参考类型:

对于引用类型的对象,您可以做

val cars: Array<Car> = Array<Car>(5){ Car() } 
//returns an array of non nullable car objects that has been initialized 
//with the method you provided in this case Car constructor with size of N

如果要创建一个非空对象数组,则在创建数组时需要对其进行初始化

    ResponseEntity<Object> 

答案 1 :(得分:1)

例如,对于dask.Series._to_frame()类,可以使用:

But

或:

var arrayC: Array<But?> = arrayOfNulls(2) // no initialization required

但这两种方法都不会禁止您创建更大数组的新实例并将其分配给变量。

编辑

我认为,有两种解决方法。

第一个方法是将您的array属性声明为var并在setter中测试分配:

var arrayC: Array<But> = Array<But>(2){But()} // initialization required

或者,如果您想在编译时处理它,则可以将属性定型并用所需的大小对其进行初始化。

class Test {
    var array: Array<Int> = Array(3){0}
        set(value) {
            if(value.size > 3)
                throw IllegalArgumentException("The array size cannot be bigger than 3")

            field = value
        }
}

fun main(args: Array<String>) {
    val test = Test()
    test.array = arrayOf(0, 1, 2) // Ok
    test.array = arrayOf(0, 1, 2, 3) // throws IllegalArgumentException

}

答案 2 :(得分:1)

是的,数组大小在Kotlin中不是其类型的一部分,也无法使其成为一部分。这不是专门针对数组的;类型在Kotlin中不能以任何方式依赖值。

  

类型中的大小初始化允许在运行时检查绑定冲突。

总是在运行时在JVM上检查数组边界。即使编译器不想这样做,也不会。