代码之家  ›  专栏  ›  技术社区  ›  Vitalii

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

  •  1
  • Vitalii  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  5
  •   Kiskae    6 年前

    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
    
        2
  •  -1
  •   Thomas Cook    6 年前
    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())
    }