【发布时间】:2020-04-08 05:21:48
【问题描述】:
在scala 中,支持case class 的父类是product:因此我们可以将其用于case classees 的多态性。 kotlin中的data classes如何实现类似的目标?
对于下面的yaml 解析器,我需要替换dataclass,它代表所有data classes 的合理父类。
inline fun <reified T: dataclass> loadFromFileDC(path: Path): T = loadFromFile(path, T::class)
fun <T: dataclass> loadFromFile(path: Path, cls: KClass<T>) = {
val mapper = ObjectMapper(YAMLFactory()) // Enable YAML parsing
mapper.registerModule(KotlinModule()) // Enable Kotlin support
Files.newBufferedReader(path).use {
mapper.readValue(it, cls.java)
}
}
【问题讨论】:
-
如果我理解正确,我认为在 Kotlin 中是不可能的。您不能从数据类继承,因此无法告诉“这是一个父级,我希望它的所有子级都是数据类”。
-
@MichaelSpitsin
data clases没有他们的自己的继承层次结构/父类可以作为他们的代理吗?如果这些接口代表核心data class行为,即使扩展一些interfaces 也可能有效。 -
没有。数据类只是普通类,有一堆预定义的方法,如“equals”、“hashCode”等。也就是说你可以从密封类、接口、任何开放或抽象类继承数据类,但没有数据类特定的层次结构据我所知。
-
嗯。我原以为它们是
kotlin相当于case class。不幸的是,看起来不是。他们甚至没有实现serializable,这让我大吃一惊。我对它们的用处持怀疑态度。 -
@MIchaelSpitsin btw 随意回答。仅仅因为它不是我更喜欢的答案,所以它同样是一个有效的答案。