Как объявить переменную с двумя типами в Kotlin, как val x: Int или String - PullRequest
0 голосов
/ 10 октября 2018

Я напишу метод вроде:

object UIBehavior {
   fun dialog(context: Context, title: Int | String, message: Int | String){
     val dialogObj = AlertDialog.Builder(context)
     dialogObj.setTitle(title)
     dialogObj.setMessage(message)
   }
}

Методы dialogObj.setTitle и dialogObj.setMessage допускают два типа параметров, и какмогу ли я объявить параметр, который позволяет методу диалоговое окно разрешать только два типа Int и String?

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

Спасибо, ребята, я писал коды

interface DialogOption {
    val title: Any
    val message: Any
    val positiveBtnTxt: Any
    val negativeBtnTxt: Any
    fun confirm(d: DialogInterface, n: Int) {
        d.dismiss()
    }
    fun cancel(d: DialogInterface, n: Int) {
        d.dismiss()
    }

}

object UIBehavior {
    fun dialog(context: Context, opt: DialogOption) {
        val dialogObj = AlertDialog.Builder(context)
        val title = opt.title
        val message = opt.message
        val poTxt = opt.positiveBtnTxt
        val negTxt = opt.negativeBtnTxt
        fun positiveCallback(d: DialogInterface, n: Int) {
            opt.confirm(d, n)
        }

        fun negativeCallback(d: DialogInterface, n: Int) {
            opt.cancel(d, n)
        }

        if (title is String) {
            dialogObj.setTitle(title)
        } else if (title is Int) {
            dialogObj.setTitle(title)
        }
        if (message is String) {
            dialogObj.setMessage(message)
        } else if (message is Int) {
            dialogObj.setMessage(message)
        }
        if (poTxt is String) {
            dialogObj.setPositiveButton(poTxt, ::positiveCallback)
        } else if (poTxt is Int) {
            dialogObj.setPositiveButton(poTxt, ::positiveCallback)
        }
        if ( negTxt is String) {
            dialogObj.setNegativeButton(negTxt, ::negativeCallback)
        } else if (negTxt is Int) {
            dialogObj.setNegativeButton(negTxt, ::negativeCallback)
        }

        dialogObj.show()
    }
}

Это работает, но не уверен, что это разумно

0 голосов
/ 10 октября 2018

Вы не можете сделать это в Kotlin.

Но у вас может быть несколько версий функции, например,

object UIBehavior {
    fun dialog(context: Context, titleId: Int, messageId: Int){
        val titleString = context.getString(titleId)
        val messageString = context.getString(messageId)
        dialog(context, titleString, messageString)
    }

    fun dialog(context: Context, title: String, message: String) {
        val dialogObj = AlertDialog.Builder(context)
        dialogObj.setTitle(title)
        dialogObj.setMessage(message)
    }
}

Таким образом, вы можете просто вызвать функцию либо с помощью идентификаторов, либоСтроки и похоже, что вы используете ту же функцию

UIBehavior.dialog(this, R.string.title, R.string.message)
UIBehavior.dialog(this, "title", "message")

Вы также можете использовать общий супертип Int и String, но это позволит гораздо больше, и я бы не рекомендовал этого.

fun dialog(context: Context, title: Any, messageId: Any){
    val titleString = when (title) {
        is String -> title
        is Int -> context.getString(title)
        else -> throw IllegalArgumentException("Unsupported type")
    }
    val messageString = when ...
       ...
    dialog(context, titleString, messageString)
}

Обобщения здесь также не работают, потому что вы не можете вызвать dialogObj.setTitle(title) динамически.Во время компиляции должно быть известно, хотите ли вы вызвать перегрузку Int или String этой функции.Это также не сильно отличается от использования Any.

0 голосов
/ 10 октября 2018

Вы можете использовать Any, но я не думаю, что это очень хорошее решение.

Было бы намного лучше сделать заголовок и сообщение String или CharSequence в соответствии с типами setTitle и setMessage, принимаемыми в качестве параметров.

0 голосов
/ 10 октября 2018

Вы можете использовать Generics , чтобы иметь тот же метод, и проверить тип в теле метода.

Или есть два разных метода.

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