Scala等JVM语言中,哪种类型声明最贴近C#/C++泛型类嵌套类型?
在Scala中实现C#/C++风格的泛型嵌套类型
此为Scala版本的问题,Rust版本的同类问题可参考Stack Overflow相关讨论。
在编写重度依赖C#或C++泛型/模板的库时,常用技巧是将多个使用相同泛型参数的结构体声明为静态类的嵌套类型。
例如,以下C#声明:
public struct Gen1<T1, T2, T3> { } public struct Gen2<T1, T2, T3> { }
与以下声明功能等价:
public static class Ts<T1, T2, T3> { public struct Gen1 { } public struct Gen2 { } }
编译器会将Ts<int, int, string>.Gen1转换为特化类,拥有独立的静态成员。Ts<int, int, String>与Ts<int, int, int>是除名称外无关联的两个不同类。
这与存在类型擦除的JVM编译器不同:JVM编译时会移除类型参数,因此相同的静态嵌套类声明转译为Java后仅存在一种类型,且无需类型参数即可初始化。
目前多数JVM语言无法突破此限制,比如Kotlin不支持类似C#/C++的泛型特化,Scala无静态声明且object类型不支持泛型参数。事实上多数语言也无类似抽象,仅LEAN4例外,其静态泛型类对应section机制。
我需要Scala/Kotlin类型系统的最小扩展方案,以逐行复现该抽象。鉴于Scala具备路径依赖类型和GADT,优先考虑Scala,具体该如何实现?
(无需编译器插件的一种实现方式是引入类型相等公理,若了解Scala 3中扩展路径依赖类型相等性的方案,可将本问题的解决方案作为特例纳入)
内容的提问来源于stack exchange,提问作者tribbloid
相关产品推荐
相关产品推荐

