如何在通用枚举随播广告上声明扩展参数

时间:2017-09-07 13:30:49

标签: generics enums kotlin extension-methods companion-object

我想在通用枚举上使用.MAX来表示值计数。

我试着玩一点,但我无法理解。

当我写作时,例如:

val Enum.Companion.MAX get() = enumValues().size

它在enumValues()抱怨

  

类型推断失败:没有足够的信息来推断

中的参数T.      

内联乐趣> enumValues   ()   :数组   请明确说明。

这很有意义,然后我也尝试了:

val <E> Enum<E>.Companion.MAX get() = enumValues().size

它在第二个E

上抱怨
  

引用嵌套类时,外部类的类型参数是多余的

有办法吗?

2 个答案:

答案 0 :(得分:7)

您必须使用reified类型参数,以便在每个呼叫站点使用实际的枚举类型:

inline val <reified T : Enum<T>> T.MAX get() = enumValues<T>().size

答案 1 :(得分:0)

扩展具有修饰类型的通用枚举

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