gpt4 book ai didi

kotlin - 泛型参数化变量/常量的语法

转载 作者:行者123 更新时间:2023-12-02 13:17:32 25 4
gpt4 key购买 nike

我正在尝试创建一个包含通用参数化类型的Map。例如:

abstract class Foo {
companion object {
val fooInjectors = HashMap<Class<T: Foo>, Injector<T: Foo>>()
}
}

这个想法是让 fooInjectors(在Java中为 static或在Kotlin中为 companion object)包含 Foo子类及其对应的 Injector的缓存。

不幸的是,我无法编译它。如果有人可以帮助我确定语法,我将非常感激!

最佳答案

据我所知,您正在尝试做Kotlin中不可能的事情。伴随对象是一个单例,并且由于将不再创建任何其他对象,因此泛化类型是无关紧要的,因此无法泛化一个单例。因此,您无法泛化声明的属性,因为它位于伴随对象中。

但是,可以使该工作正常进行的一种方法是使用支持功能。此支持功能应使用声明位置差异进行注释。

这仅表示我们告诉编译器,我们仅从该方法返回T类型(并且不使用)。这使我们可以根据需要使用T的子类型和父类(super class)型。这称为协方差。

您可以查看文档以进一步了解它-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>()
}
}

关于kotlin - 泛型参数化变量/常量的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62436939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com