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

时间:2017-11-02 21:44:41

标签: generics kotlin operator-overloading operators

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

以下是一个例子:

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")

的工作原理。我正在寻找使用运营商&#34; /&#34;。

的东西

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

最后,答案最终是无法完成的。

我决定使用overriding(),这样我就可以获得泛型类型了。我还添加了一个没有显式返回&#34; MyType&#34;因此,链接调用将使用最终只需要的泛型类型。

所以现在看起来像:

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
}