目前我有多個列舉,每個列舉都有一個userFriendly : string,例如
enum class TestGroup(val userFriendly: String) {
A("A"),
B("B")
}
對于每個列舉,我現在有一個單獨的函式將它們轉換為 SelectField 類:
class SelectField(
val value: String, /** The value which gets submitted e.g. a UUID or other identifier */
val text: String /** The human-friendly label e.g. the name of an organisation */
)
fun transformTestGroups(testGroups: Array<TestGroup>): List<SelectField> =
testGroups.map {
SelectField(
value = it.name,
text = it.userFriendly
)
}
我發現列舉可以實作一個介面:
interface UserFriendly {
val userFriendly: String
}
enum class TestGroup(override val userFriendly: String) : UserFriendly {
A("A"),
B("B")
}
但是,我不知道如何制作genericTransform(values:Array<Enum<UserFriendly>>):List<SelectField>. 這在 Kotlin 中可能嗎?
uj5u.com熱心網友回復:
Kotlin 中的陣列是可變的,因此是不變的。這是一種說 anArray<Int>不是的奇特方式Array<Any>。這樣做的原因是:如果我們可以x: Array<Int>轉換為Array<Any>,那么我們可以寫x[0] = "ABC",因為"ABC"是一個有效的Any,并且現在x將包含一個不是整數的值。
所以在這里簡單地使用超型別是行不通的。但仿制藥會。具體來說,我們將使用奇怪的重復模板模式來要求我們的通用引數是一個 enum和一個UserFriendly.
fun<T> transformTestGroups(testGroups: Array<T>): List<SelectField>
where T: UserFriendly,
T: Enum<T> =
// Same implementation as before :)
testGroups.map {
SelectField(
value = it.name,
text = it.userFriendly
)
}
完整的可運行示例:
interface UserFriendly {
val userFriendly: String
}
enum class TestGroup(override val userFriendly: String): UserFriendly {
A("A"),
B("B")
}
data class SelectField(
val value: String,
val text: String
)
fun<T> transformTestGroups(testGroups: Array<T>): List<SelectField>
where T: UserFriendly,
T: Enum<T> =
testGroups.map {
SelectField(
value = it.name,
text = it.userFriendly
)
}
fun main(args: Array<String>) {
println(transformTestGroups(arrayOf(TestGroup.A, TestGroup.B)))
}
在線嘗試!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519888.html
標籤:科特林仿制药枚举
上一篇:模板類的多型性
下一篇:無法使用介面創建通用有界類物件
