【问题标题】:How can I specify a generic type on an overloaded operator in Kotlin?如何在 Kotlin 的重载运算符上指定泛型类型?
【发布时间】:2018-04-15 13:21:29
【问题描述】:

我希望重载除法运算符“/”,但希望允许指定泛型类型来指导返回值的类型。

这是一个例子:

inline operator fun <reified T> MyType.div(fieldName: String): T {
    val value = someFunction(fieldName) 
    return convertToExpectedValue(value)
}

不幸的是,当无法推断泛型类型 T 时,我无法找到显式指定泛型类型 T 的方法。我想知道是否有类似以下的方法可以使用?

val stringVal = myType /<MyType> "myField" /<String> "myStringField"

请注意,我知道

myType.div<String>("blah")

有效。我正在寻找使用运算符“/”的东西。

【问题讨论】:

    标签: generics kotlin operator-overloading operators


    【解决方案1】:

    您必须使用中间变量,或者(使用 Kotlin 1.2)as

    val midVal: MyType = myType / "myField"
    val stringVal: String = midVal / "myStringField"
    
    // or with Kotlin 1.2
    // I'm not 100% sure about this one actually, so take this with a grain of salt
    
    val stringVal = ((myType / "myField") as MyType / "myStringField") as String
    

    【讨论】:

      【解决方案2】:

      到最后,答案是最终做不到。

      我决定使用覆盖 () 以便获得泛型类型。我还添加了一个没有显式返回“MyType”的泛型的版本,以便链接调用可以使用仅在最后需要的泛型类型。

      所以现在看起来像:

      val stringVal = myType("fieldName")<String>("myStringField")
      

      函数定义代码为:

      inline operator fun <reified T> MyType.invoke(fieldName: String): T {
          val value = someFunction(fieldName) 
          return convertToExpectedValue(value)
      }
      
      operator fun MyType.invoke(fieldName: String): MyType {
          return someFunction(fieldName) as MyType
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 2016-01-25
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 2018-10-19
        • 1970-01-01
        • 2010-10-21
        相关资源
        最近更新 更多