Kotlin необязательный универсальный параметр - PullRequest
0 голосов
/ 05 июля 2018

Вот проблема, которую я пытаюсь решить, я пытаюсь использовать тип void как универсальный тип:

class Parent {
    private abstract class Item<out T>(val data: T)
    // This subclass should contain data
    private class ItemContent(val data: String): Item<String>(data)
    // This subclass doesn't contain data
    private class ItemNoContent: Item<Any?>(null)
}

Некоторые базовые классы, такие как ItemNoContent, не содержат значимых данных, поэтому я делаю ItemNoContent расширяет Item (null). Это работает, но я чувствую, что использование Any? и нуль здесь неуместен. Есть ли более Kotlin способ решить эту необязательную проблему?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Некоторые базовые классы, такие как ItemNoContent, не содержат значимых данных

Тогда зачем расширять класс, который должен иметь его? Хотя Unit и null оба варианта, рассмотрим также

private abstract class Item<out T>
private abstract class ItemWithContent<out T>(val data: T) : Item<T>
...
// object may make more sense than class here
private object ItemNoContent : Item<Nothing>()
0 голосов
/ 05 июля 2018

Я бы настроил наследование так:

abstract class Item

abstract class ItemWithContent<T>(val d: T): Item()

class ItemWithStringContent(d: String): ItemWithContent<String>(d)

class ItemWithNoContent: Item()

Таким образом, нет необходимости использовать Unit или Nothing.

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

fun main(args: Array<String>){
    val t: Item = ItemWithStringContent("test")
    println((t as? ItemWithStringContent)?.d)
}
0 голосов
/ 05 июля 2018

Вы также можете использовать Item<Unit>(Unit), что представляет значение void в Kotlin.

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