Impossible d'appeler la fonction d'extension kotlin depuis java
Je sais que les fonctions d'extention kotlin sont compilées en tant que fonction statique en utilisant fileName comme nom de classe avec le suffixe Kt. Le problème est que ma fonction de paramètre String unique demande deux paramètres String lorsqu'elle est appelée à partir du code java.
La fonction d' extension est dans le fichier KUtils
fun String.extractDigits(strValue: String): String {
val str = strValue.trim { it <= ' ' }
var digits = ""
var chrs: Char
for (i in 0..str.length - 1) {
chrs = str[i]
if (Character.isDigit(chrs)) {
digits += chrs
}
}
return digits
}
Appeler le code Java
KUtilsKt.extractDigits("99PI_12345.jpg")
Message d'erreur de compilation:
Erreur: (206, 42) erreur: la méthode extractDigits dans la classe KUtilsKt ne peut pas être appliquée à des types donnés;
requis: chaîne, chaîne
trouvée:
raison de la chaîne : la longueur des listes d'arguments réelle et formelle diffère
S'il vous plaît aider
merci
Le problème est que l'instance réceptrice est codée en tant que paramètre. Donc:
fun String.extractDigits(strValue: String): String {...}
Devient ( javap
sortie):
public static final java.lang.String extractDigits(java.lang.String, java.lang.String);
Mais vous ne transmettez qu'un seul argument à la fonction.
Je ne comprends pas très bien pourquoi vous utilisez une fonction d'extension ici, je m'attendrais à voir l'instance de réception utilisée au lieu de passer une valeur distincte:
fun String.extractDigits(): String {
val str = this.trim { it <= ' ' } // Using `this`, i.e. the receiving instance
var digits = ""
var chrs: Char
for (i in 0..str.length - 1) {
chrs = str[i]
if (Character.isDigit(chrs)) {
digits += chrs
}
}
return digits
}
Ensuite, en Java, vous pouvez l'appeler comme vous l'avez essayé, et en Kotlin comme ceci:
val str = "123blah4"
println(str.extractDigits()) // prints 1234