Любая строковая функция в Kotlin?

#kotlin

#kotlin

Вопрос:

В Kotlin,

Я хочу создать метод, который принимает функцию таким образом, чтобы функция могла быть применена Any , но возвращает строку. По сути, это функция для извлечения строк.

Как я мог это сделать? Итак, это будет что-то вроде этого: предположим, у меня есть 2 модели

 class A{
  val myStirngRef: String
}
  
 class B{
  val otherStringRef: String
}
  

и тогда у меня есть метод

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

Возможно ли это в Kotlin или проблема с изменением типа?

Ответ №1:

Это так же просто, как toString :

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

Ответ №2:

Не уверен, понимаю ли я, как вы собираетесь использовать эту функцию. Но предположим, что функция может быть вызвана для любого объекта, а function переданная вами ссылка является получателем для строковой ссылки, тогда вы можете сделать это с помощью generics:

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

Использование:

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

// or

doSomethingWithEitherAOrBType(b) { it.otherStringRef } 
  

Ответ №3:

В Kotlin нет типов объединения. Итак, вам нужно определить перегруженные варианты этой функции:

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

Использование:

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