4

J'essaie d'utiliser une fonction avec le type réifié comme fonction d'extension mais je ne pense pas que ce soit possible car après avoir vérifié le bytecode généré, j'ai trouvé que la signature de la méthode est privée.Kotlin réifiée type fonction comme extension de fonction - Appelable à partir de Java?

CommonExtensions.kt

inline fun<reified T: Activity> Context.startActivity() { 
    val intent = Intent(this, T:: class.java) 
    startActivity(intent) 
} 

fun View.visible() { 
    visibility = View.VISIBLE 
} 

Kotlin bytecode:

private final static startActivity(Landroid/content/Context;)V 
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0 
    ... 

Code client:

fichier Kotlin

override fun showMessageEmptyOfferFeeds() { 
     mOfferFeedsWarning.visible() // "visible()" extension func RESOLVED 
} 

fichier Java

showProfileDetailsUi(){ 
    startActivity<DetailActivity>() //"startActivity()" extension func NOT RESOLVED 
} 

Répondre

3

Oui vous pouvez utiliser inline fonctions avec reified types comme des fonctions d'extension. Il est fait private de sorte que le code Java ne peut pas y accéder (btw ce n'est pas le cas pour les fonctions inline "normales"). Une telle fonction peut être inlineprivate pour Kotlin parce que les fonctions en ligne sont copiés à l'endroit où ils sont invoquaient.

Un example:

inline fun <reified T : Activity> Activity.startActivity() { 
    startActivity(Intent(this, T::class.java)) 
} 

//usage 

startActivity<DetailActivity>() 

En savoir plus sur reified dans une autre question, je répondais: https://stackoverflow.com/a/45952201/8073652

Encore une fois: Vous ne pouvez pas utiliser les fonctions inline avec reified typé de Java.

+0

Oui c'est seulement un niveau de classe .. mais je ne peux pas l'utiliser à côté du fichier dans lequel il est défini .. ma question est de savoir comment l'utiliser comme des fonctions d'extension normales? – Abdellah

+0

Essayez de définir le niveau supérieur. C'est une classe comme Extensions.kt qui pourrait contenir votre fonction seulement, sans classe autour de lui – s1m0nw1

+0

Je l'ai fait mais ne fonctionne pas – Abdellah

2

inline reified fonctions de disppear 'après la compilation, car les types réifiées n'existent pas sur la machine virtuelle Java. C'est un tour du compilateur. La seule raison pour laquelle la fonction privée est là est probablement de provoquer une erreur si quelqu'un essaie de la surcharger pendant l'exécution, puisque la fonction réifiée est complètement inline et ne peut pas être surchargée.

+2

Bonjour, il ne disparaît pas. c'est seulement rendre la visibilité privée pour éviter que le code Java l'appelle. –