首页 > 解决方案 > 以大小为类型信息的 N 元组类

问题描述

我正在尝试在 Kotlin 中创建一个 N-Tuple,这意味着一个固定大小的集合/数组,它的大小作为类型信息。例子:

val tuple3 = Tuple<3>(1,2,3) //Type Tuple<3>
val tuple4 = Tuple<4>(4,5,6,7) //Type Tuple<4>

class Tuple<N>() {...}

问题是,我不能将特定数字作为泛型类型传递(例如在 typescript 或 c++ 中)。是否有某种方法可以使我没有看到或某种解决方法使此工作,告诉编译器将不同大小的元组视为不同的类型?

从 0..N-1 的范围索引也会很好:

val tuple = Tuple<3>(1,2,3)
tuple[1] //Good
tuple[14] //Error

但同样,我无法让它工作。

用例:我想在 Vector 类中实现元组:

class Vector<N>(...) : Tuple<N>(...) {...}

val vector3 = Vector(1,2,3)
val vector4 = Vector(4,5,6,7)

vector3 + vector3 //Good
vector3 + vector4 //Error

并为向量定义算术运算,例如加法。这是关于大小的类型信息很重要的地方,因为应该只能添加 2 个相同大小的向量。当然,我可以只进行运行时大小检查并抛出错误,但编译时错误将是更好的解决方案。还有其他重要的用例,其中元组/向量的大小在编译时很重要。

我不只是创建说 8 个不同的子类(如 Tuple1、Tuple2、Tuple3...)的原因是因为我可能需要任何大小的 Tuple/Vector。仅仅创建一堆子类是一个非常丑陋的解决方案。

标签: kotlingenerics

解决方案


推荐阅读