2
나는 기능코 틀린 슈퍼 Kclass
abstract class AbstractDao<T>(private val dataStore: KotlinEntityDataStore<Persistable>): Dao<T> where T: Persistable
의 definiction을하고 난 형 T
에서 KClass
을 얻을 필요가있다. Kotlin에서 가능합니까?
나는 기능코 틀린 슈퍼 Kclass
abstract class AbstractDao<T>(private val dataStore: KotlinEntityDataStore<Persistable>): Dao<T> where T: Persistable
의 definiction을하고 난 형 T
에서 KClass
을 얻을 필요가있다. Kotlin에서 가능합니까?
type erasure으로 인해 수행 할 수 없습니다. 그러나 reified type
팩토리 메소드를 제공하여 KClass
을 허용하는 생성자에 위임 할 수 있습니다. 여기에 간단한 예입니다 :
class WithReifiedType<T> constructor(val kc: KClass<*>) {
companion object {
inline fun <reified T> getInstance(): WithReifiedType<T> {
println("Here's your KClass: ${T::class}")
return WithReifiedType(T::class)
}
}
}
//called like this
WithReifiedType.getInstance<String>()
그것은 발신자 사이트의 생성자처럼 보이는 (동반자 - 임베디드 공장에 대한 대안으로) 최상위 함수를 만들 수도 가능합니다.
inline fun <reified T> WithReifiedType(): WithReifiedType<T> {
println("Here's your KClass: ${T::class}")
return WithReifiedType(T::class)
}
//called like this
WithReifiedType<String>()
'데이터 저장소 : KotlinEntityDataStore'을 원하셨습니까? 나는 왜 Persistable에 대한 일반적인 타입의 인자가 있고 왜 명백한 Persistable의 인자가 있는지 이해하지 못한다. –
KotlinEntityDataStore은 생성자의 파라미터 일 뿐이다. –
bajky
아니요, 'T'의 null이 아닌 인스턴스를 참조 할 수없는 경우 JVM 유형 삭제로 인해 클래스 서명에서 단독으로 작업하는 것이 불가능합니다. 이 문제를 해결하기위한 옵션은 생성자를 private으로 만들고,'AbstractDao'의 인스턴스를 반환하는 구체화 된'T' 인수로 인라인 함수를 (companion 객체에) 넣는 것입니다. 말이 돼? –