2015-03-06 1 views
2

Par exemple, j'ai exemple de codefonction Redéfinition avec les génériques dans Kotlin

fun f<T>(cb: (T, Int) -> Unit): Unit { 
    println("f called with cb which accepts 2 arguments"); 
} 

fun f<T>(cb: (T) -> Unit): Unit { 
    println("f called with cb which accepts 1 argument"); 
    f<T> {item, position -> cb(item) } 
} 

fun main(args : Array<String>) { 
    f { item -> } 
    f { item, position -> } 
} 

Inconsciemment Je veux fonction f choisir la mise en œuvre droite dépend de la quantité d'arguments que je vais passer à la fermeture

Actuellement k ompiller me donne l'erreur:

(8, 7) : Overload resolution ambiguity: 
internal fun <T> f(cb: (T, kotlin.Int) -> kotlin.Unit): kotlin.Unit defined in root package 
internal fun <T> f(cb: (T) -> kotlin.Unit): kotlin.Unit defined in root package 

code en bac à sable en ligne: http://kotlin-demo.jetbrains.com/?publicLink=100745728838428857114-628607155

Version compiller: org.jetbrains.kotlin: Kotlin-gradle-plugin: 0.10.770


UPD: le problème lié YouTrack: https://youtrack.jetbrains.com/issue/KT-6939

+1

On dirait un bug. S'il vous plaît signaler au tracker: https://youtrack.jetbrains.com/issues/KT#newissue –

+0

Le message d'erreur est différent maintenant (compilateur version 0.11.693): "L'inférence de type a échoué: pas assez d'informations pour inférer le paramètre T dans le fun f (cb: (T) -> kotlin.Unit): kotlin.Unit Veuillez le spécifier explicitement. " Ce qui a du sens pour moi :) – miensol

+0

@miensol mais ça ne fonctionne toujours pas comme prévu:/ – ruX

Répondre

3

Merci à @miensol j'ai réalisé c'etait mon erreur. J'ai oublié de spécifier le type pour T en appelant f().

Code fixe:

fun f<T>(cb: (T, Int) -> Unit): Unit { 
    println("f called with cb which accepts 2 arguments"); 
} 

fun f<T>(cb: (T) -> Unit): Unit { 
    println("f called with cb which accepts 1 argument"); 
    f<T> {item, position -> cb(item) } 
} 

fun main(args : Array<String>) { 
    f<String> { item -> } 
    f<Boolean> { item, position -> } 
}