Kotlin:实现者必须是数据 class 的接口?

Kotlin: Interface whereby the implementor must be a data class?

是否有一个我可以扩展的接口或一些其他方法来创建一个接口,其中实现 class 必须是一个数据 class?访问数据 class API 方法(例如 copy().

)会很有用

所以我要在我的回答前说我没有使用 Kotlin 的经验,但我有很多 Java 经验,据我所知这是相似的,所以除非 Kotlin 有一个特性这有助于做你想做的事 Java 没有,我的回答可能仍然适用。

如果我理解正确,基本上你想做的是强制执行任何 class 实现你的接口 X,也必须是 Y 的子类型。

我的第一个问题是你为什么要这样做?强制 X 仅由 Y 的子类型实现是混合接口和实现,这与接口的用途完全相反。

要强制执行此操作,您必须让 X 隐式或显式地扩展 Y 的接口。因为在 Java(大概是 Kotlin)中,接口不能扩展对象,你有两个选择:

1) 扩展数据接口,如果它存在的话(考虑到我一直在阅读的关于数据的内容,我认为它不存在 classes。这听起来更像是一个内置的语言功能不仅仅是一个有用的代码对象)

2) 从数据 classes 中向您的接口添加您想要的方法的确切方法签名。通过这样做,您获得了两件事:首先,只要数据 class 实现了您的接口,您就可以获得便捷的方法;其次,您仍然拥有接口本来应该提供的灵活性,因为现在甚至 non-data classes 可以 实现你的接口,如果你需要的话,他们只需要确保手动定义数据 classes 接口方法。

不,copy方法对每个数据class都有唯一数量的参数,所以有这样的接口是没有用的。如果您的所有数据 class 都有相同的字段 - 只需创建并实现通用接口。