Kotlin可选通用参数

时间:2018-07-05 16:07:22

标签: 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)
}

某些基本类(如ItemNoContent)不包含有意义的数据,因此我使ItemNoContent扩展了Item(null)。它有效,但是我觉得可以使用Any吗? null在这里是不合适的。有没有更多的Kotlin方法来解决此可选的通用问题?

3 个答案:

答案 0 :(得分:9)

您还可以使用Item<Unit>(Unit)来表示Kotlin中的void值。

答案 1 :(得分:3)

  

一些基本类(如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>()

答案 2 :(得分:1)

我会这样调整继承:

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