不,data
类在类型系统中没有任何特定表示,并且无法与常规类区分开来(类似问题)。
但是,您可以要求data
具有一定数量组件的类使用接口(实际上它将是data
类上的标记接口)的方法。
data
这是具有两个组件的类的示例:
interface Data2<T1, T2> {
operator fun component1(): T1
operator fun component2(): T2
fun copy(t1: T1, t2: T2): Data2<T1, T2>
}
toString
,hashCode
并且equals
无论如何都可以在任何类型上调用。
然后只需使用接口标记您的data
类:
data class Impl(val i: Int, val s: String): Data2<Int, String>
val d: Data2<Int, String> = Impl(1, "2")
val (c1, c2) = d
val copy = d.copy(-1, d.component2())
copy
函数不是完全类型安全的,因为 Kotlin没有 self 类型(也没有办法要求接口实现是特定类型的子类型),但是如果你只用它标记你的data
类,它应该可以工作(见下面的另一个选项)。
另一个缺点是您丢失了copy
方法的默认参数,并且必须使用指定的所有参数调用它:
val d = myD2.copy(newValue, myD2.component2())
另一种选择是将这些接口定义为Data2<T1, T2, out Self>
,class Impl(...): Data2<..., Impl>
和 make copy
return Self
,但如果使用接口 as 并不会更好Data2<SomeType, SomeType, *>
。