Kotlin可选通用参数

Kotlin可选通用参数,kotlin,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 co

以下是我试图解决的问题,我试图使用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)
}
类父类{
私有抽象类项(val数据:T)
//这个子类应该包含数据
私有类ItemContent(val数据:字符串):项(数据)
//此子类不包含数据
私有类ItemNoContent:Item(null)
}

一些基类,比如ItemNoContent,不包含有意义的数据,所以我将ItemNoContent扩展为Item(null)。它的工作,但我觉得使用任何?而null在这里是不合适的。有没有一种更适合Kotlin的方法来解决这个可选的通用问题

您还可以使用
项(单位)
,它表示Kotlin中的
无效值

某些基类(如ItemNoContent)不包含有意义的数据

那么为什么要扩展一个应该有它的类呢?虽然<代码>单元< /代码>和<代码> 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>()
私有抽象类项
私有抽象类ItemWithContent(val数据:T):项
...
//在这里,对象可能比类更有意义
私有对象ItemNoContent:Item()

我会像这样调整继承:

abstract class Item

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

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

class ItemWithNoContent: Item()

什么都不做
做你想做的吗@nicholas.hauschild它不起作用,因为您不能将
无赋值给
数据
字段。@Pawel但您可以使用
无赋值?
并将
空赋值给
数据
。但我认为语义是错误的?我不清楚您什么时候想使用
什么都不用?
<代码>单位
在这里更有意义。@Pawel感谢您的澄清!
fun main(args: Array<String>){
    val t: Item = ItemWithStringContent("test")
    println((t as? ItemWithStringContent)?.d)
}