T 및 일부 메타 데이터의 배열 (또는 목록)이 포함 된 인터페이스가 있습니다. 나는 인터페이스의 간단한 구현을 작성하는 경우Kotlin 제네릭 배열 <T> "Reified 형식 매개 변수로 T를 사용할 수 없습니다. 대신 클래스 사용"으로 표시되지만 은 표시되지 않습니다.
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): Array<T>
}
, 나는에 컴파일 오류를 얻을 emptyArray()
"구체화 타입 매개 변수로 T를 사용할 수 없습니다 대신 클래스를 사용합니다.." 나는 인터페이스와 목록에 구현 모두를 변경하는 경우
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
}
}
그러나, 나는 더 컴파일시 문제가 없습니다 :
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
}
}
내가 코 틀린 제네릭에 몇 가지 흥미로운 교훈은 내 문제 내부가 의심 . 누구나 컴파일러가 후드에서 수행하는 작업과 어레이가 실패하지만 목록이없는 이유를 알 수 있습니까? 이 컨텍스트에서 Array 구현을 컴파일하는 관용적 인 방법이 있습니까?
보너스 질문 : 내가 Array over List에 도달 한 유일한 이유는 내가 종종 Kotlin 개발자들이 Array를 선호한다는 것입니다. 이 경우인가요? 그렇다면 이유는 무엇입니까?
public inline fun <reified @PureReifiable T> emptyArray(): Array<T>
reified
유형의 매개 변수는 컴파일시 T
의 클래스에 액세스 할 수 있음을 의미 다음 코 틀린의 다음 stdlib (JVM)에서 emptyArray()
의 선언을 보면