Kotlin の拡張関数の宣言について質問です。
以下の拡張関数をレシーバ型がCollection<T>において
funの後に”<T>”が必要になります。なぜこの宣言が必要なのか教えていただきたいです。
Kotlin
1fun <T> Collection<T>.joinToString( 2 /*省略*/ 3):String{ 4 /*省略*/ 5 return result.toString() 6}
また、レシーバ型をCollection<String>にした際にはfunの後にダイヤモンド演算子の記載が不要になります。
なぜ不要にあるのか教えていただきたいです。
Kotlin
1fun Collection<String>.joinToString( 2 /*省略*/ 3):String{ 4 /*省略*/ 5 return result.toString() 6}
参考となるlinkもいただけると助かります。
http://dogwood008.github.io/kotlin-web-site-ja/docs/reference/generics.html
そういう仕様だからです。一つが関数の型パラメータで、もう一つが引数の型パラメータです。
一つ省略しても読めるので人間にとっては不要ですが、コンピューターにとっては推論の負荷がかかります。また複雑なジェネリクスを書いた際に曖昧さが生じる可能性があるかもしれません。
メリット・デメリットを考えてこの仕様を採用したのは制作者です。詳細を知りたい場合もしくは仕様変更を提案する場合は、公式に問い合わせてください。
あなたの回答
tips
プレビュー