Reflection 确定实例是否为数据类的实例

Reflection 确定实例是否为数据类的实例,reflection,kotlin,Reflection,Kotlin,给定以下类 abstract class SomeAbstractClass { abstract val name: String } data class DataClass( override val name: String ) : SomeAbstractClass() class NoDataClass( override val name: String ) : SomeAbstractClass() 对于SomeAbstractClass的任何实例,我是否可以在不依赖类型检查的

给定以下类

abstract class SomeAbstractClass { abstract val name: String }
data class DataClass( override val name: String ) : SomeAbstractClass()
class NoDataClass( override val name: String ) : SomeAbstractClass()
对于
SomeAbstractClass
的任何实例,我是否可以在不依赖类型检查的情况下确定它是否为

一些背景:对我来说,这似乎是结合继承和数据类的最佳方式。现在,在
SomeAbstractClass
的初始值设定项块中,我想在派生类型不是数据类的情况下抛出一个异常,以确保派生类型的“正确”(不可变)实现。

使用,可以在要调查的实例上使用
::class
语法获得Kotlin类描述()(在您的情况下,
this::class
位于抽象类的初始值设定项块中)。这使您可以访问:

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


但是,由于数据类仍然可以包含
var
成员,因此您可能还需要检查所有成员变量(以及它们的成员变量是否递归)定义为
val
,以确保所有派生类的不变性。

请注意,数据类仍然可以有var成员。另外,作为一个轶事,我经常发现自己需要创建密封类的非数据类子类型,因为Kotlin不支持零成员数据类:/@OliverCharlesworth感谢您指出这一点out。我想接下来我必须检查是否所有成员都定义为“val”。@OliverCharlesworth您提出的第二点(不可能有零成员数据类)对我来说并不重要,因为我的抽象类包含一个需要实现的接口(简化代码示例中未显示),因此每个派生成员都保证有成员。显然,我以前发布的代码不正确(正是因为零成员问题),所以我现在将抽象成员包含在抽象类中。