Search code examples
genericsinterfacekotlininlinekotlin-reified-type-parameters

generic interfaces with reified methods


I have several objects to reinterpreter memory:

interface reinterpreter<T> {
    operator fun get(index: Int): T
    operator fun set(index: Int, value: T): Any
}

object vec1bData : reinterpreter<Vec1b> {    
    override operator fun get(index: Int) = Vec1b(data, index * Vec1b.size)    
    override fun set(index: Int, value: Vec1b) = value.to(data, index * Vec1b.size)    
}

but when I type

inline fun <reified T> data():reinterpreter<T> = when (T::class.java) {    
        Vec1b::class.java -> vec1bData    
}

I get:

required reinterpeter<T>, but found vec1bData

How can I solve?


Solution

  • The type vec1bData is not a valid substitute for reinterpeter<T>, because the T of vec1bData is not generic, but set to Vec1b.

    That means, taking just the function signature fun <reified T> data(): reinterpreter<T>, you must return a reinterpreter<T>. Instead you return a vec1bData, which is of type reinterpreter<Vec1b> instead of reinterpreter<T>.