Kotlin可选泛型参数

5us2dqdw  于 7个月前  发布在  Kotlin
关注(0)|答案(4)|浏览(65)

下面是我试图解决的问题,我试图使用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?和null是不合适的。有没有更Kotlin的方法来解决这个可选的通用问题?

vd2z7a6w

vd2z7a6w1#

您也可以使用Item<Unit>(Unit),它表示Kotlin中的void值。

l7mqbcuq

l7mqbcuq2#

一些基类(如ItemNoContent)不包含有意义的数据
那么为什么要扩展一个应该有它的类呢?虽然Unitnull都是选择,但还要考虑

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>()

字符串

cbeh67ev

cbeh67ev3#

我会像这样调整继承:

abstract class Item

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

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

class ItemWithNoContent: Item()

字符串
这样,就不需要使用UnitNothing
使用方法:

fun main(args: Array<String>){
    val t: Item = ItemWithStringContent("test")
    println((t as? ItemWithStringContent)?.d)
}

bnlyeluc

bnlyeluc4#

虽然有点晚了,但现在有一种更优雅的方法可以使用data object和代数数据类型来完成这一任务。

sealed interface Item

data class ItemContent<T : Any>(val content: T) : Item

data object ItemNoContent : Item

字符串
关于如何准确地实现这一点,有几种不同的变体。例如,ItemContent可以实现为值类。或者,您可以将泛型类型提升到Item<T>,并使ItemNoContent : Item<Nothing>
但在任何实现中,这种层次结构都与Option非常相似。

相关问题