2017-12-20 20 views
3

私はこれを見ましたquestion「オーバーロード解決のあいまいエラー」は別のオーバーロードで解決しました

は、どのようにそれがこのラインで

fun Int.toUpperCase() = "" 

にこの問題を追加しました

Error:(6, 16)
Overload resolution ambiguity:
@InlineOnly public inline fun Char.toUpperCase(): Char defined in kotlin.text
@InlineOnly public inline fun String.toUpperCase(): String defined in kotlin.text

は、コードのこの作品のために離れて行くことができますか?

fun main(args: Array<String>){ 
    var ab: String? = "hello" 
    ab = null 
    println(ab?.toUpperCase()) 
} 

参照の質問のために与えられた答えは理にかなって、それはちょうどここに何が起こっているのか答えていません。

+1

確かに、それはいくつかのヘッドスクラッチマテリアルです:) –

答えて

0

ファイルにfun String.toUpperCase() = ""を再度定義しても機能します。コンパイラは、ローカルで定義された関数を使用するように選択し、あいまいなものはもう考慮しません。 abNothing?になります。これはすべてのnull可能な型のサブタイプです。受信者はこれを実現します。

チェックは、この1:ローカルに定義された拡張機能が使用されているので、STDLIBから

fun main(args: Array<String>) { 
    println("hello".substringBefore("e")) 
} 

fun String.substringBefore(e: String) = "hey" 

substringBeforeが呼び出されることはありません。

関連する問題