如何在 Kotlin 中的重载运算符上指定泛型类型?

How can I specify a generic type on an overloaded operator in Kotlin?

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

这是一个例子:

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

不幸的是,当无法推断泛型类型 T 时,我想不出一种显式指定它的方法。我想知道是否有像下面这样的东西可以工作?

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

请注意,我知道

myType.div<String>("blah")

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

你必须使用中间变量,或者(使用 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

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

我决定使用重写 () 以便获得通用类型。我还添加了一个没有显式 returns "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
}