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
。因此,它需要受到两者的约束。至少,我是这样理解你的要求的。