【问题标题】:Is there a way to make extension function to data class type only?有没有办法只对数据类类型进行扩展功能?
【发布时间】:2021-09-19 08:09:47
【问题描述】:

我的问题是我想要一个仅适用于数据类的扩展函数。

例如,假设我有多个数据类。

data class Person(
    val name: String,
    val age: Int
)

data class Car(
    val color: Color,
    val brand: String
)

等等。

现在我想创建一个仅为数据类扩展的扩展函数,而不是像这样我必须为每个类创建扩展函数。

例如我的扩展函数:

fun Person.convertToJson() : String {
    return Gson().toJson(this)
}

fun Car.convertToJson() : String {
    return Gson().toJson(this)
}

我只想要一个具有魔力的函数,我也不想使用泛型,因为它对所有对象都可用。这是通用函数示例:

fun <T>  T.convertToJson() : String {
    return Gson().toJson(this)
}

我想要与只适用于数据类类型的泛型函数等效的东西。

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    该语言没有在所有数据类上定义扩展函数的特性。如果您可以修改数据类以实现接口,那么您可以为此使用标记接口

    /* define a marker interface and have all your data classes implement it */
    interface Jsonable 
    
    data class Person(val name: String, val age: Int): Jsonable
    
    data class Car(val color: Color, val brand: String): Jsonable
    

    现在您可以将interface 上的扩展函数定义为

    fun Jsonable.convertToJson(): String = Gson().toJson(this)
    

    你可以把它当作

    Person("A", 50).convertToJson()
    

    【讨论】:

      【解决方案2】:

      我认为您无法对数据类类型进行扩展功能,但您可以通过创建数据类可以扩展的接口来克服这个问题,然后为实现定义接口的任何类进行扩展

      interface IHuman 
      
      data class Person(val name: String, val age: Int): IHuman
      
      data class Student(val name: String, val schoolName: String): IHuman
      
      
      inline fun <reified T: IHuman> T.doSomething(){
          println("Which one call me: ${T::class.java.simpleName}")
      }  
      
      fun main(){
          Person(name = "Mohamed", age = 28).doSomething()
          Student(name = "Ahmed", schoolName = "MySchool").doSomething()
      }
      

      【讨论】:

        【解决方案3】:

        我希望下面的代码可以帮助您解决没有任何接口的问题

        扩展功能:

        inline fun <reified T : Any> T.objectToString(): String = Gson().toJson(this, T::class.java)
        inline fun <reified T : Any> String.stringToObject(): T = Gson().fromJson(this, T::class.java)
        

        拨打电话:

        Object.objectToString() // This will return string
        String.stringToObject<Object>() // This will return Object
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-15
          相关资源
          最近更新 更多