这是我要解决的问题,我尝试将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方法来解决此可选的通用问题?
答案 0 :(得分:9)
您还可以使用Item<Unit>(Unit)
来表示Kotlin中的void
值。
答案 1 :(得分:3)
一些基本类(如ItemNoContent)不包含有意义的数据
然后为什么要扩展应该具有的类?尽管Unit
和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>()
答案 2 :(得分:1)
我会这样调整继承:
abstract class Item
abstract class ItemWithContent<T>(val d: T): Item()
class ItemWithStringContent(d: String): ItemWithContent<String>(d)
class ItemWithNoContent: Item()
这样,就不需要使用Unit
或Nothing
。
用法:
fun main(args: Array<String>){
val t: Item = ItemWithStringContent("test")
println((t as? ItemWithStringContent)?.d)
}