【发布时间】:2021-04-09 11:20:22
【问题描述】:
我有以下枚举,其中每个枚举类实现RatingValue 接口,每个伴随对象实现RatingValues<T> 接口
enum class Clarity(override val value: Int) : RatingValue {
EXCELENT(5),
VERY_GOOD(4),
GOOD(3),
FAIR(2),
POOR(1);
companion object : RatingValues<Clarity>
}
enum class Colour(override val value: Int) : RatingValue {
EXCELENT(10),
VERY_GOOD(8),
GOOD(6),
FAIR(4),
POOR(2);
companion object : RatingValues<Colour>
}
RatingValues接口有ratings()方法,定义为扩展:
inline fun <reified T> RatingValues<T>.ratings(): List<Int> where T : RatingValue, T : Enum<T> = enumValues<T>().map { it.value }
我想实现一个方法,它采用 RatingValue 枚举的可变参数参数,可以像这样调用
val cumulativeRating = cumulate(Colour, Clarity)
我的第一个想法是编写以下内容,但是由于 RatingValues 的泛型类型参数 T 明显不同,因此失败了
private inline fun <reified T> cumulate(vararg ratings: RatingValues<T>) : List<Int> where T: RatingValue, T : Enum<T> {
return ratings
.map(RatingValues<T>::ratings)
.fold(listOf(0, 0, 0, 0, 0)) { x, y -> x.zip(y, Int::plus) }
}
【问题讨论】:
标签: kotlin generics enums variadic-functions