2016-12-18 18 views
5

Tôi đã viết mã bên dưới để lấy một chiếc KClass có số Array<*>.Làm thế nào để có được một KClass of Array?

Array::class 

Tuy nhiên, mã này có lỗi biên dịch.

Kotlin: Array lớp đen đòi hỏi một đối số kiểu, xin ghi rõ một trong dấu ngoặc nhọn

Bạn có biết lý do hoặc giải pháp?

Trả lời

8

Trên nền tảng JVM, Kotlin Array<T> types được ánh xạ tới Java arrays, trong đó, không giống như các loại chung Java, không phải tuân theo type erasure, chúng là reified thay thế. Nó có nghĩa là, trong số những thứ khác, mảng với các loại phần tử khác nhau được đại diện bởi các lớp khác nhau, có các mã thông báo Class<T> khác nhau và các mã lớp này chứa thông tin về loại phần tử. Không có loại mảng chung, nhưng chỉ có các loại mảng cho mảng có các loại phần tử khác nhau.

Kể từ genericArray<T> không tồn tại, bạn không thể sử dụng phản chiếu của nó hoặc là, bạn chỉ có thể nhận được những thông tin kiểu thời gian chạy của các loại mảng với các loại nguyên tố đã chỉ định:

val c = Array<Int>::class // corresponds to Java Integer[] type 
val d = Array<Array<String>>::class // corresponds to Java String[][] 

val e = IntArray::class // corresponds to Java int[] 

Nếu bạn cần phải kiểm tra xem một lớp tùy ý là một loại mảng, bạn có thể làm điều đó với sự phản chiếu Java:

val c = Array<Int>::class 

println(c.java.isArray) // true 
Các vấn đề liên quan