Kotlin中的泛型:如何访问伴侣对象

时间:2018-06-24 19:44:53

标签: generics kotlin

我有2个枚举

enum class Enum1{
    X1, X2, X3, X4;
    companion object {
        val default = X2
    }
}
enum class Enum2{
    Y1, Y2, Y3;
    companion object {
        val default = Y3
    }
}

他们两个都有一个带有default变量的伴随对象。

我有两种方法可以返回该值

private fun printDefaultEnum1() : String{
    return Enum1.default.toString()
}

private fun printDefaultEnum2() : String{
    return Enum2.default.toString()
} 

在Kotlin中是否可以优化此代码,并且只有一种接受类型并输出相应值的通用方法?

2 个答案:

答案 0 :(得分:5)

可以通过以下事实做到这一点:伴随对象可以实现接口:

interface DefaultEnum<E : Enum<E>> {
    val default: E
}

fun genericPrint(e: DefaultEnum<*>): String = e.default.toString()

然后可以按以下方式使用它:

companion object : DefaultEnum<Enum1> {
    override val default: Enum1 = X2
}

genericPrint(Enum1) // This calls it with the companion object of Enum1

答案 1 :(得分:-1)

enum class Enum1 {
    X1, X2, X3, X4;
    companion object {
        val default = X2
    }

    override fun toString(): String = default.toString()
}

enum class Enum2 {
    Y1, Y2, Y3;
    companion object {
        val default = Y3
    }

    override fun toString(): String = default.toString()
}

private fun genericPrint(any: Any) {
    println(any.toString())
}

fun main(args: Array<String>) {
    genericPrint(Enum1)
}

或者,甚至更简单:

enum class Enum1 {
    X1, X2, X3, X4;
    companion object {
        val default = X2
    }

    override fun toString(): String = default.toString()
}

enum class Enum2 {
    Y1, Y2, Y3;
    companion object {
        val default = Y3
    }

    override fun toString(): String = default.toString()
}

fun main(args: Array<String>) {
    println(Enum1.toString())
}