如何在一组Enum类中为String和Enum值编写可重用的转换? (Kotlin)

我有一个> 5的Enum类,它的值中包含String参数,我想要所有这些Enum类的简单代码从JSON对象中的字符串字段进行转换。

enum class Religiousness(val jsonStr: String, val resID: Int) { NotAtAll("none", R.string.not_religious), Somewhat("somewhat", R.string.somewhat_religious), Very("very", R.string.very_religious), ; override fun toString() = jsonStr fun displayString(res: Resources) = res.getString(resID) } 

我想能够写这样的代码

 fun JsonConvertStrToEnum(enumClass: Class<Enum<*>>, str: String): Enum<*> { for (enumval in enumClass.enumConstants) { if ((enumval as IJsonStringConvertible).jsonStr() == str) return enumval } throw IllegalArgumentException("Gave an invalid enum value for class ${enumClass.canonicalName}") } 

我很难找出IJsonStringConvertible是否可以工作,以及它的定义是什么,以及如何在Enum值实例中实现它。 任何建议?

更新:我现在已经写了这个转换器。 这是最好的方法吗? 我是否也可以表示返回值是参数的子类型,所以不需要转换返回值?

 fun JsonConvertStrToEnum(enumClass: Class<out Enum<*>>, str: String): Enum<*> { for (enumval in enumClass.enumConstants) { if (enumval.toString() == str) return enumval } throw IllegalArgumentException("Gave an invalid enum value for class ${enumClass.canonicalName}") } 

枚举作为其他类可以实现如下接口:

 interface IJsonStringConvertible { val jsonStr:String } enum class Religiousness(override val jsonStr: String, val resID: Int) : IJsonStringConvertible { NotAtAll("none", R.string.not_religious), Somewhat("somewhat", R.string.somewhat_religious), Very("very", R.string.very_religious), ; override fun toString() = jsonStr fun displayString(res: Resources) = res.getString(resID) } 

然后将被用作:

 for (enumval in enumClass.enumConstants) { if ((enumval as IJsonStringConvertible).jsonStr == str) return enumval } 

然而,上面的查找可能是昂贵的(如果使用数百万次)。 看看反向查询问题 ,找出如何更有效地做到这一点。

如果它有帮助的人,这是最终版本,我认为它可能:)

 fun <EnumT : Enum<EnumT>> ConvertStrToEnum(enumClass: Class<EnumT>, str: String?): EnumT? { if (str == null) return null for (enumval in enumClass.enumConstants) { if (enumval.toString() == str) return enumval } throw IllegalArgumentException("Gave an invalid enum value for class ${enumClass.canonicalName}") } fun <EnumT : Enum<EnumT> > ConvertStrArrayToEnumSet(enumClass: Class<EnumT>, array: List<String>?) : EnumSet<EnumT> { val set = EnumSet.noneOf(enumClass) array?.forEach { value -> set.add(ConvertStrToEnum(enumClass, value)) } return set }