如何在 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
}
我希望重载除法运算符“/”,但希望允许指定通用类型来指导 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
}