如何在通用枚举伙伴上声明扩展参数
How to declare extension parameter on generic enums companions
我想在通用枚举上使用 .MAX
来表示值计数。
我试着玩了一下,但我想不通。
当我写的时候,例如,这个:
val Enum.Companion.MAX get() = enumValues().size
它在 enumValues()
上抱怨
Type inference failed: Not enough information to infer parameter T in
inline fun > enumValues
( )
: Array
Please specify it explicitly.
有道理,那我也试了:
val <E> Enum<E>.Companion.MAX get() = enumValues().size
第二次报错E
Type arguments for outer class are redundant when nested class is referenced
有办法吗?
您必须使用具体化的类型参数,以便在每个调用站点使用实际的枚举类型:
inline val <reified T : Enum<T>> T.MAX get() = enumValues<T>().size
使用具体化类型扩展通用枚举
inline fun <reified T : Enum<T>> max(): Int = enumValues<T>().size
// Then call
max<MyEnum>()
或者,您可以将它添加到枚举的实例中
inline val <reified T : Enum<T>> T.max get() = enumValues<T>().size
// Then call
MyEnum.VALUE.max // or myEnumVal.max
我想在通用枚举上使用 .MAX
来表示值计数。
我试着玩了一下,但我想不通。
当我写的时候,例如,这个:
val Enum.Companion.MAX get() = enumValues().size
它在 enumValues()
上抱怨
Type inference failed: Not enough information to infer parameter T in
inline fun > enumValues ( ) : Array Please specify it explicitly.
有道理,那我也试了:
val <E> Enum<E>.Companion.MAX get() = enumValues().size
第二次报错E
Type arguments for outer class are redundant when nested class is referenced
有办法吗?
您必须使用具体化的类型参数,以便在每个调用站点使用实际的枚举类型:
inline val <reified T : Enum<T>> T.MAX get() = enumValues<T>().size
使用具体化类型扩展通用枚举
inline fun <reified T : Enum<T>> max(): Int = enumValues<T>().size
// Then call
max<MyEnum>()
或者,您可以将它添加到枚举的实例中
inline val <reified T : Enum<T>> T.max get() = enumValues<T>().size
// Then call
MyEnum.VALUE.max // or myEnumVal.max