下面是我试图解决的问题,我试图使用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的方法来解决这个可选的通用问题?
4条答案
按热度按时间vd2z7a6w1#
您也可以使用
Item<Unit>(Unit)
,它表示Kotlin中的void
值。l7mqbcuq2#
一些基类(如ItemNoContent)不包含有意义的数据
那么为什么要扩展一个应该有它的类呢?虽然
Unit
和null
都是选择,但还要考虑字符串
cbeh67ev3#
我会像这样调整继承:
字符串
这样,就不需要使用
Unit
或Nothing
。使用方法:
型
bnlyeluc4#
虽然有点晚了,但现在有一种更优雅的方法可以使用
data object
和代数数据类型来完成这一任务。字符串
关于如何准确地实现这一点,有几种不同的变体。例如,
ItemContent
可以实现为值类。或者,您可以将泛型类型提升到Item<T>
,并使ItemNoContent : Item<Nothing>
但在任何实现中,这种层次结构都与
Option
非常相似。