确定一个实例是否是一个数据类的一个实例

鉴于以下类别

abstract class SomeAbstractClass { abstract val name: String } data class DataClass( override val name: String ) : SomeAbstractClass() class NoDataClass( override val name: String ) : SomeAbstractClass() 

对于SomeAbstractClass任何实例,我可以确定它是否是一个数据类而不依赖于types检查?

一些背景:这似乎是把inheritance和数据类结合起来的最好方式, 正如不同的答案中所建议的那样 。 现在,在SomeAbstractClass的初始化块中,我想抛出一个exception,以防派生types不是数据类,以确保派生types的“正确”(不可变)实现。

使用reflection ,Kotlin类描述( KClass )可以使用你想调查的实例的::class语法(在你的情况下,抽象类的初始化块中的this::class class)获得。 这使您可以访问isData

如果此类是数据类,则为true。

但是,正如Oliver所指出的那样 ,数据类仍然可以包含var成员,因此您可能还需要检查是否所有成员variables(及其成员variables递归)都被定义为val以确保所有派生类的不变性。