Android kotlin метод принимает любой тип объекта в качестве параметра - PullRequest
0 голосов
/ 28 февраля 2020

Я хочу передать 2 разных типа объекта методу для обновления представления. Как можно, чтобы этот метод принимал 2 разных типа объектов и получал к ним доступ вместо двух разных методов для 2 разных типов объектов.

Мне нужно что-то вроде этого -

fun updateView(object: Any<T>) {
   //Access the objects here to update the view
}

Ответы [ 8 ]

2 голосов
/ 28 февраля 2020
fun <T : Any> updateView(obj: T) {
    //Access the objects here to update the view
}

ИЛИ

fun updateView(obj: Any ?= null, obj2:Any ?= null) {
    // Access the objects here to update the view

    // pass check nullity and use which you want (or not null), other parameter will remain null

    obj?.let {
       it...
    }

    obj2?.let {
       it...
    }
}

Вызов

updateView(obj1, obj2)

// OR

updateView(obj2 = myObj2)
2 голосов
/ 28 февраля 2020

Для этого можно использовать интерфейсы:

interface ViewInterface {
    fun action() 
}

class ObjectA : ViewInterface {...}
class ObjectB : ViewInterface {...}

fun updateView(ob: ViewInterface) {
    ob.action()
}


2 голосов
/ 28 февраля 2020

попробуйте что-то вроде этого

fun updateView(variable1: Any? = null, variable2:Any? = null) {
//Access the objects here to update the view
}

, используя именованные параметры, затем вы можете просто установить переменные, которые вам нужны при вызове метода:

 updateView(variable1 = "something")
 updateView(variable2 = "something else")
1 голос
/ 28 февраля 2020

Использовать полиморфизм

fun updateView(object: X) {
    ...
}

fun updateView(object: Y) {
    ...
}
1 голос
/ 28 февраля 2020

Таким способом можно передать два типа объекта

 fun updateView(data:Any? = null,data2:Any?=null) {
    //Cast Your Object To your desired type and also can pass null too
    // Access the objects here to update the view
}
1 голос
/ 28 февраля 2020

Пусть ваши 2 объекта реализуют один и тот же интерфейс или наследуют один и тот же суперкласс, а затем сделайте что-то вроде:

fun updateView(object: MyInterface) {
    ...
}
0 голосов
/ 01 марта 2020

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

interface DoesStuff

class DoesStuffA: DoesStuff { }

class DoesStuffB: DoesStuff { }

fun doStuff(doer: DoesStuff) {
    // do stuff

    // if need to distinguish between types
    when (doer) {
        is DoesStuffA -> // do A
        is DoesStuffB -> // do B
    }
}
0 голосов
/ 28 февраля 2020

Я бы посоветовал разделить две функции или использовать какое-либо наследование для использования одной функции. Но, как я вижу, ни один из вышеперечисленных (которые являются правильными, с точки зрения SOLID) не удовлетворяет ваш запрос, вы можете просто проверить внутри функции на основе класса.

fun updateView(object: Any) {

when(object){
    is Class1Type -> // do whatever fits for the first case
    is Class2Type -> // do whatever fits for the second case
    else -> // etc.
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...