Kotlin 如何为enumValues创建通用函数<;T>;在科特林?
我很难为使用Kotlin 如何为enumValues创建通用函数<;T>;在科特林?,kotlin,generics,enums,Kotlin,Generics,Enums,我很难为使用enumValues()函数的过程提供一个类型作为参数。 让它与具体化的一起工作,但是一直使用内联函数对我来说是没有选择的 有趣的特质( selectionState:SnapshotStateMap ) { val chunks=enumValues().toList().chunked(5) 块{ 划船{ 这是forEach{ TraitIcon(it、selectionState) } } } } 我的枚举都源自枚举类Trait。因此,实际上我想将枚举类TraitFoo:Tr
enumValues()
函数的过程提供一个类型作为参数。
让它与具体化的
一起工作,但是一直使用内联
函数对我来说是没有选择的
有趣的特质(
selectionState:SnapshotStateMap
) {
val chunks=enumValues().toList().chunked(5)
块{
划船{
这是forEach{
TraitIcon(it、selectionState)
}
}
}
}
我的枚举都源自枚举类Trait
。因此,实际上我想将枚举类TraitFoo:Trait
,枚举类TraitBar:Trait
等等传递到函数中
无法将“T”用作具体化的类型参数。改为使用类
是我在这里收到的编译错误。有解决这个问题的办法吗?我有点困惑,为什么这不起作用
查看enumValues
的实现:
公共内联值():数组
我看到它使用了具体化的。这意味着必须在编译时知道类型。因此,我不能传递泛型,但需要传递显式类型?这就是问题所在吗
如果是-是否有其他方法来实现这一点,而不是使用具体化?如果您希望能够在函数中使用T
,就必须将其具体化。为了使类型参数具体化,它必须是内联函数的一部分。所以你需要一个内联函数
下一步是找出泛型。您目前有:
这意味着,由于枚举的性质,T
不可能是除Trait
之外的任何东西。但是,您已经澄清了Trait
不是枚举,而是由各种枚举类实现的接口。因此,您真正想要的是T
受Enum
和Trait
的约束
考虑到所有这些,我相信您需要的是:
inlinefun特性(
选择状态:快照跟踪映射
)其中T:Enum,T:Trait{
val chunks=enumValues().toList().chunked(5)
块{
划船{
这是forEach{
TraitIcon(it、selectionState)
}
}
}
}
所以类似于内联有趣特征(…)的东西,其中T:Enum,T:Trait{…}
对您不起作用?注意where子句是因为我假设Trait
不是Enum
(即它没有声明为Enum类Trait{…}
)。如果Trait
已经是一个枚举,那么我不明白t
的初衷。您说您的枚举类继承自另一个枚举类,但这是不可能的。你能澄清一下吗?@Tenfour04你认为这不可能的消息来源是什么?请看这里:-这是我声明继承的地方,并且在代码中使用它,与Trait
@xetra11具有协方差。您可以在这里看到Slaw注释的编译版本。当然,它不能使用“real”Row
,SnapeshotStateMap
等,但它仍然可以工作;如果没有,请编辑您的问题,以包括您使用的代码以及错误发生的位置。因为您正在尝试使用enumValues()
,这就要求t
为Enum
。您还希望枚举实现Trait
。因此,它需要受到两者的约束。至少,我是这样理解你的要求的。