繁体   English   中英

具有所需接口的通用枚举类型参数

[英]Generic Enum type parameter with required interface

我有一个如下所示的界面:

interface LabelledEnum {
    fun getLabelId(): Int
}

我在枚举 class 中继承了这个接口,如下所示:

enum class Period : LabelledEnum {
    YTD {
        override fun getLabelId(): Int =
            R.string.ytd_label
    },
    ONE_MONTH {
        override fun getLabelId(): Int =
            R.string.1m_label
    },
    THREE_MONTHS {
        override fun getLabelId(): Int =
            R.string.3m_label
    },
    SIX_MONTHS {
        override fun getLabelId(): Int =
            R.string.6m_label
    },
    ONE_YEAR {
        override fun getLabelId(): Int =
            R.string.1y_label
    },
    THREE_YEARS {
        override fun getLabelId(): Int =
            R.string.3y_label
    },
    FIVE_YEARS {
        override fun getLabelId(): Int =
            R.string.5y_label
    },
    MAX {
        override fun getLabelId(): Int =
            R.string.max_label
    };
}

我有一个自定义可组合我正在处理我想要使其通用的地方(使用类型参数而不是硬编码的东西),但我正在努力寻找一种方法来实现这个通用类型参数,以便类型参数必须是一个继承的 Enum我的界面LabelledEnum

到目前为止,我的可组合看起来像这样:

@Composable
inline fun <reified T : Enum<T>> CustomTabRow(
    selectedEnum: T,
    crossinline onEnumSelected: (T) -> Unit,
    modifier: Modifier = Modifier,
) {
    // Things happen here
}

有没有办法确保类型参数TEnum并且继承自LabelledEnum

如果没有,我将使用一种解决方法,但如果可能的话,我真的更愿意完成这项工作

Kotlin 有一个where语法来表达这样的约束

@Composable
inline fun <reified T> CustomTabRow(
    selectedEnum: T,
    crossinline onEnumSelected: (T) -> Unit,
    modifier: Modifier = Modifier,
) where T : Enum<T>, T : LabelledEnum  {
    // Things happen here
}

请注意,您必须将T: Enum<T>移动到where子句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM