2017-11-02 8 views
1

除算演算子 "/"をオーバーロードしたいのですが、戻り値の型を導くジェネリック型を指定できるようにしたいと考えています。Kotlinのオーバーロードされた演算子にジェネリック型を指定するにはどうすればよいですか?

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

残念ながら、私はそれを推測することができない時に明示的にジェネリック型Tを指定する方法を把握することはできません。

は、ここでの例です。私は働くことができる次のようなものがあれば疑問に思いますか?私はその

myType.div<String>("blah") 

作品を知っている

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

注意。私は演算子 "/"を使う何かを探しています。あなたは中間変数を使用する必要があり、または(Kotlin 1.2)as

答えて

2

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 
0

結局、答えはそれが出来ないという究極的です。

オーバーライド()を行うことに決めたので、ジェネリック型を取得できました。私は明示的に "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 
} 
関連する問題