4 votes

Pourquoi les annotations ne sont-elles pas prises en charge dans les fonctions d'ordre supérieur ?

C'est l'erreur que je reçois lors de l'utilisation d'une annotation personnalisée dans une fonction d'ordre supérieur :

image error

Y a-t-il un moyen d'utiliser des annotations dans les fonctions d'ordre supérieur ? Sinon, quelle serait une solution alternative (à part l'utilisation des énumérations) ?

Voici à quoi ressemble mon annotation personnalisée :

companion object {
   private const val PERMISSION_DENIED = 1
   private const val PROVIDER_DISABLED = 2
   private const val SUCCESS = 3

   @IntDef(PERMISSION_DENIED, PROVIDER_DISABLED, SUCCESS)
   @Retention(AnnotationRetention.SOURCE)
   annotation class PreconditionResult
}

2voto

Jakub Zalas Points 14150

Contournement

Il existe un contournement qui implique des interfaces fonctionnelles (remarquez la interface fun ci-dessous).

Remarque: Malheureusement, les interfaces fonctionnelles définies dans le code Kotlin ne sont disponibles que depuis la prochaine version 1.4. Vous pouvez le tester maintenant avec 1.4-M1.

fun interface FulFilled {
    fun execute(@PreconditionResult fulFilled: Int): Unit
}

private fun checkPrecondition(context: Context, fulFilled: Fulfilled) {
}

checkPrecondition(context) { fulFilled -> println("Got $fulFilled")}

Solution possible

Je ne suis pas sûr que cela permette d'atteindre ce dont vous avez besoin, mais il est également possible de supprimer le nom de l'argument de la définition de votre type:

private fun checkPrecondition(context: String, callback: (@PreconditionResult Int) -> Unit) {

Vous devrez changé la cible de votre annotation pour un type:

    @Retention(AnnotationRetention.SOURCE)
    @Target(AnnotationTarget.TYPE)
    annotation class PreconditionResult

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X