Насколько мне известно, вы пытаетесь сделать то, что невозможно в Kotlin. Сопутствующий объект является одноэлементным, и нет смысла создавать одноэлементный объект, так как больше не будет создаваться никаких объектов, поэтому общие c типы не имеют значения. Таким образом, вы не можете генерировать объявленное свойство, потому что оно находится в сопутствующем объекте.
Однако один из способов заставить это работать - использовать функцию поддержки. Эта функция поддержки должна аннотироваться отклонением от места объявления .
Это просто означает, что мы сообщаем компилятору, что мы возвращаем только тип T
из метода (и не потребляем). Это позволяет нам при необходимости использовать подтипы и супертип T
. Это называется ковариацией.
Вы можете посмотреть документацию, чтобы понять это дальше - https://kotlinlang.org/docs/reference/generics.html#declaration -site-variance
Вот что я имел в виду.
interface Injector<T>
class InjectorImpl<T> : Injector<T>
abstract class Foo {
companion object {
val fooInjectors = createMap<Foo>()
private fun <T> createMap(): HashMap<Class<out T>, Injector<out T>> {
return HashMap()
}
}
}
class Bar: Foo()
object Runner {
@JvmStatic
fun main(args: Array<String>) {
Foo.fooInjectors[Bar::class.java] = InjectorImpl<Bar>()
Foo.fooInjectors[Foo::class.java] = InjectorImpl<Bar>()
}
}