Tôi có giao diện chứa mảng (hoặc danh sách) của T và một số siêu dữ liệu.Kotlin generics Array <T> kết quả trong "Không thể sử dụng T làm tham số kiểu được sửa đổi. Sử dụng lớp thay thế" nhưng Danh sách <T> không
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): Array<T>
}
Nếu tôi viết thực hiện đơn giản nhất của giao diện, tôi nhận được một lỗi biên dịch trên emptyArray()
: "Không thể sử dụng T như một tham số kiểu reified Sử dụng một lớp học để thay thế.."
class ArrayWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> {
private var myData: Array<T> = emptyArray()
override fun getData(): Array<T> {
return myData
}
fun addData(moreData: Array<T>) {
this.myData += moreData
}
}
Tuy nhiên, nếu tôi thay đổi cả giao diện và thực hiện vào một danh sách, tôi không có vấn đề thời gian biên dịch:
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): List<T>
}
class ListWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> {
private var myData: List<T> = emptyList()
override fun getData(): List<T> {
return myData
}
fun addData(moreData: Array<T>) {
this.myData += moreData
}
}
tôi nghi ngờ có một số bài học thú vị trong Generics Kotlin bên trong vấn đề của tôi . Bất cứ ai có thể cho tôi biết những gì trình biên dịch đang làm theo mui xe và tại sao Array không nhưng Danh sách không? Có một cách thành ngữ để làm cho việc thực hiện Array biên dịch trong bối cảnh này?
Câu hỏi thưởng: Lý do duy nhất tôi đạt được cho Array over List là tôi thường thấy các nhà phát triển Kotlin ưu tiên Mảng. Đây có phải là trường hợp không, và nếu có thì tại sao?