2017-12-30 12 views
2

나는 기능코 틀린 슈퍼 Kclass

abstract class AbstractDao<T>(private val dataStore: KotlinEntityDataStore<Persistable>): Dao<T> where T: Persistable 

의 definiction을하고 난 형 T에서 KClass을 얻을 필요가있다. Kotlin에서 가능합니까?

+0

'데이터 저장소 : KotlinEntityDataStore '을 원하셨습니까? 나는 왜 Persistable에 대한 일반적인 타입의 인자가 있고 왜 명백한 Persistable의 인자가 있는지 이해하지 못한다. –

+0

KotlinEntityDataStore 은 생성자의 파라미터 일 뿐이다. – bajky

+0

아니요, 'T'의 null이 아닌 인스턴스를 참조 할 수없는 경우 JVM 유형 삭제로 인해 클래스 서명에서 단독으로 작업하는 것이 불가능합니다. 이 문제를 해결하기위한 옵션은 생성자를 private으로 만들고,'AbstractDao '의 인스턴스를 반환하는 구체화 된'T' 인수로 인라인 함수를 (companion 객체에) 넣는 것입니다. 말이 돼? –

답변

1

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>()