Kotlin可选的通用参数

dar*_*ord 12 kotlin

这是我试图解决的问题,我试图使用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)
}
Run Code Online (Sandbox Code Playgroud)

像ItemNoContent这样的基类不包含有意义的数据,因此我使ItemNoContent扩展Item(null).它有效,但我觉得使用Any?和null在这里不合适.是否有更多的Kotlin方法来解决这个可选的通用问题?

Paw*_*wel 14

您还可以使用Item<Unit>(Unit)它代表voidKotlin中的值.


Ale*_*nov 5

一些像 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>()
Run Code Online (Sandbox Code Playgroud)


Wil*_*zel 5

我会像这样调整继承:

abstract class Item

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

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

class ItemWithNoContent: Item()
Run Code Online (Sandbox Code Playgroud)

这样就不需要使用Unitor了Nothing

用法:

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