-1
votes

Une fonction de chaîne dans Kotlin?

À Kotlin,

Je veux créer une méthode qui prend une fonction telle que la fonction peut être appliquée sur Any mais renvoie une chaîne. Il s'agit essentiellement d'une fonction d'extraction de chaînes.

Comment pourrais-je faire ça? Donc ce sera quelque chose comme ceci: Supposons que j'ai 2 modèles

fun doSomethingWithEitherAOrBType(instance: Any, function: (Any) -> String){
   val str = function.call(instance)
}
class B{
  val otherStringRef: String
}

et puis j'ai une méthode

class A{
  val myStirngRef: String
}

Est-ce possible dans Kotlin ou y a-t-il un changement de type sur un problème?


0 commentaires

3 Réponses :


0
votes

C'est aussi simple que toString :

fun anyToString(arg: Any): String = arg.toString()


0 commentaires

0
votes

Je ne sais pas si je comprends comment vous comptez utiliser cette fonction. Mais en supposant que la fonction puisse être appelée sur n'importe quel objet et que la référence de function vous passez est le getter pour la référence String, vous pouvez le faire avec des génériques:

val b = B()
doSomethingWithEitherAOrBType(b, B::otherStringRef) 

// or

doSomethingWithEitherAOrBType(b) { it.otherStringRef } 

Usage:

inline fun <T: Any> doSomethingWithEitherAOrBType(instance: T, function: (T) -> String){
    val str = function(instance)
    // ...
}


0 commentaires

0
votes

Il n'y a pas de types d'union à Kotlin. Vous devez donc définir des variantes surchargées de cette fonction:

doSomethingWithEitherAOrBType(A()) { myStirngRef }
doSomethingWithEitherAOrBType(B()) { otherStringRef }

Usage:

inline fun doSomethingWithEitherAOrBType(instance: A, function: A.() -> String) = with(instance, function)
inline fun doSomethingWithEitherAOrBType(instance: B, function: B.() -> String) = with(instance, function)


0 commentaires