【发布时间】:2026-02-17 11:45:01
【问题描述】:
我在 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
如果我能以某种方式防止类型别名之间的隐式转换,那就太好了,有助于避免此类问题。
当然,存在一个问题,即对基本类型的操作不适用于类型别名,但可以通过扩展函数(或强制转换)来解决。
我不想使用包含单个字段的数据类,因为这似乎有点矫枉过正,尤其是对于原始类型(或者我错了,它们会被优化掉?)
所以问题是:我可以以某种方式强制类型别名的类型安全吗?
【问题讨论】:
-
目前唯一的方法是创建显式类型。
class Latitude : Double。或者我在这里错过了什么?然后编译器将强制输入,但在大多数情况下您仍然可以将其视为 Double。 -
@Mikezx6r 是的,你错过了几件事:1)你不能从原始类型继承,2)你不能从最终类继承 3)这种方法有运行时开销
-
这在没有 Kotlin 1.5 的实验性功能的情况下是可能的,添加了一个答案。
标签: kotlin type-alias