Kotlin 通用参数化变量/常量的语法

Kotlin 通用参数化变量/常量的语法,kotlin,generics,Kotlin,Generics,我正在尝试创建一个包含泛型参数化类型的映射。例如: abstract class Foo { companion object { val fooInjectors = HashMap<Class<T: Foo>, Injector<T: Foo>>() } } 抽象类Foo{ 伴星{ val fooInjects=HashMap() } } 其思想是让Foo(在Java中是静态的,或者在Kotlin中是伴随对象的)包含Foo的子类及其相应的Inj

我正在尝试创建一个包含泛型参数化类型的
映射。例如:

abstract class Foo {
 companion object {
  val fooInjectors = HashMap<Class<T: Foo>, Injector<T: Foo>>()
 }
}
抽象类Foo{
伴星{
val fooInjects=HashMap()
}
}
其思想是让
Foo
(在Java中是
静态的
,或者在Kotlin中是
伴随对象的
)包含
Foo
的子类及其相应的
Injector
的缓存


不幸的是,我无法编译这个。如果有人能帮我弄清楚这个的语法,我将不胜感激

据我所知,你在试图做一些在科特林不可能做到的事情。伴生对象是一个单例对象,它没有意义泛化一个单例对象,因为不会再创建任何其他对象,因此泛型类型是不相关的。因此不能泛化声明的属性,因为它位于伴生对象中

然而,一种使其工作的方法是使用支持函数。此支持功能应使用声明站点差异进行注释

这仅仅意味着我们告诉编译器我们只从方法返回类型
T
(并且不使用)。这允许我们在需要时使用
T
的子类型和超类型。这叫做协方差

您可以查看文档以进一步了解-

这就是我的意思

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>()
    }
}
接口注入器
类InjectorImpl:Injector
抽象类Foo{
伴星{
val=createMap()
private fun createMap():HashMap{
返回HashMap()
}
}
}
类栏:Foo()
对象运行器{
@JvmStatic
趣味主线(args:Array){
Foo.fooInjectors[Bar::class.java]=InjectorImpl()
Foo.fooInjectors[Foo::class.java]=InjectorImpl()
}
}

你是说
?如果你想要协方差,你就必须使用它,一个映射不能对每个条目有不同的泛型类型。您只需将类和注入器类型设置为纯Foo,并将映射设置为私有。您可以公开一个getter,该getter将您从映射中获得的值强制转换为其他值。非常感谢!很高兴这有帮助。