Kotlin类型安全的类型别名

eka*_*ets 7 type-alias kotlin

我在Kotlin代码中经常使用类型别名,但是我想知道是否可以对它们实施类型安全性。

typealias Latitude = Double
typealias Longitude = Double

fun someFun(lat: Latitude, lon: Longitude) {...}

val lat: Latitude = 12.34
val lon: Longitude = 56.78
someFun(lon, lat) // parameters are in a wrong order, but the code compiles fine
Run Code Online (Sandbox Code Playgroud)

如果能以某种方式防止类型别名之间的隐式转换,从而避免此类问题,那将是很好的。

当然,存在一个问题,基本类型的操作将无法用于类型别名,但是可以使用扩展功能(或强制转换)解决。

我不想使用仅包含一个字段的数据类,因为这似乎有些过大,尤其是对于原始类型(或者我错了,它们会被优化吗?)

那么问题来了:我可以以某种方式为类型别名强制执行类型安全吗?

Dan*_*rov 12

Kotlin 1.3 更新

从 Kotlin 1.3 开始,内联类已经可用,目前被标记为实验性的。查看文档

原答案

不幸的是,您目前无法避免这种情况。有一个正在进行的功能 -内联类(本文档中的#9),它将解决运行时开销的问题,同时强制执行编译时类型安全。它看起来与Scala 的 value classes非常相似,如果您有大量数据,这很方便,而普通 case classes 将是一个开销。