2017-10-18 11 views
1

注:この質問は汎用クラスについてではなく、汎用関数に関するものです。(私はそれがthis oneの複製であることを信じていません:それはそれ以上具体的である)KotlinのFloatとDoubleの間での拡張関数の実装の共有

私たちのプロジェクトでは、我々はDoubleFloatを拡張するためのユーティリティ機能のほんの一握りを持っている、などtoFixedなど(に触発Javascript's Number.toFixed

fun Double.toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this) 
fun Float.toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this) 

あなたが見ることができるように、Double.toFixedFloat.toFixedが同一の実装を持っています。

このようないくつかの他の、より複雑な拡張機能があるので、1つのバージョン(たとえば、Double.toPrecision)の改善とバグ修正は退屈でエラーが発生しやすくなる、手動(Float.toPrecisionで)同期される必要があります。

複製された実装を共有された<templated>関数に移動することを実験しましたが、(正しく)バインドされていない関数のコンテキストでthisにアクセスできません。

private fun <T>toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this) 
fun Double.toFixed = ::toFixed<Double> 
fun Float.toFixed = ::toFixed<Float> 

任意の言語がこれをロックすることができた場合は、確実にKotlinのことができます。

は、私がこのような何かを期待していた、説明するために!思考?

+1

[Kotlinにおけるジェネリッククラスに対する拡張機能]の可能な重複(https://stackoverflow.com/questions/32883936/extension-functions-for-generic-classes-in-kotlin) –

答えて

3

fun <T> T.toFixed(...)を使用すると、汎用タイプの拡張を実現できます。そうすることで、thisにアクセスできます。

問題は、extendstionがどのタイプでも使用できることです。あなたはそれを制限するためにあなたのT上の上限を使用することができます。

fun <T: Number> T.toFixed(...)

あなたが本当に唯一Floatダブルに拡張を制限する必要がある場合は、それが唯一の具体的な種類を拡張する必要があります。加えてKoltin mathライブラリを見て、:)(1.2-Betaで使用可能)役に立つかもしれません:
https://github.com/JetBrains/kotlin/blob/master/js/js.libraries/src/core/math.kt

関連する問題