Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Enums 如何跨一组枚举类编写字符串到枚举值的可重用转换?(科特林)_Enums_Kotlin - Fatal编程技术网

Enums 如何跨一组枚举类编写字符串到枚举值的可重用转换?(科特林)

Enums 如何跨一组枚举类编写字符串到枚举值的可重用转换?(科特林),enums,kotlin,Enums,Kotlin,我有一组>5个枚举类,它们的值中包含字符串参数,我想为所有这些枚举类提供简单的代码,以便从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.str

我有一组>5个枚举类,它们的值中包含字符串参数,我想为所有这些枚举类提供简单的代码,以便从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}")
}
funJSONConvertStrToEnum(enumClass:Class,str:String):枚举{
for(enumClass.enumConstants中的enumval){
if((枚举值为IJsonStringConvertible).jsonStr()==str)
返回枚举值
}
抛出IllegalArgumentException(“为类${enumClass.canonicalName}提供了无效的枚举值”)
}
我很难弄清楚ijsonStringConverable是否可以工作,它的定义是什么,以及如何在枚举值实例中实现它。有什么建议吗

更新:我现在已经这样编写了转换器。这是最好的方式吗?我还可以表示返回值是参数的子类型,所以不需要强制转换返回值吗

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}")
}
funJSONConvertStrToEnum(enumClass:Class,str:String):枚举{
for(enumClass.enumConstants中的enumval){
if(enumval.toString()==str)
返回枚举值
}
抛出IllegalArgumentException(“为类${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
}
fun convertstrtonum(enumClass:Class,str:String?):EnumT?{
如果(str==null)
返回空
for(enumClass.enumConstants中的enumval){
if(enumval.toString()==str)
返回枚举值
}
抛出IllegalArgumentException(“为类${enumClass.canonicalName}提供了无效的枚举值”)
}
fun ConvertStrArrayToEnumSet(enumClass:Class,array:List?):EnumSet{
val set=EnumSet.noneOf(enumClass)
数组?.forEach{value->set.add(convertstrtonum(enumClass,value))}
返回集
}

很抱歉问了一个愚蠢的问题,但是使用
if(enumval.toString()==str)
有什么问题吗?这是真的-只要我决定像这样重写toString,我就不需要使用任何
JsonStringConvertible
或类似的东西。您好,看到您的更新了。很高兴能帮到你。根据您更新的问题,您可以在此处查看如何从
类返回泛型类型
参数:也可以查看文档的这一部分:最后一件事是关于最佳方式问题的答案:没有最佳方式,所有事情都取决于需要和环境。在你的情况下,对我来说,最好的方法是使用toString,因为1)我看不到更多的上下文,所以这个解决方案很好;2) 对于接口,我们可以进行其他实现(而不是枚举);3) 它将要求编写额外的代码来为您的具体枚举类型提供转换;4) 在您的例子中,toString是类型的逻辑字符串表示(您应该实现toString,请查看Joshua Bloch提供的有效java),谢谢。我大部分时间都在这里。我在Religousness构造函数中有
valjsonstr:String
。出现错误“'jsonStr'隐藏超类型的成员…”。不确定为什么它需要
覆盖
修改器。我想我只是把需要“覆盖”的地方隔开了。顺便问一下,你有没有想过如何摆脱浮动函数,把它写成类扩展之类的东西?@user3175580“浮动函数”是什么意思?