#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 }