我在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

如果我能以某种方式防止类型别名之间的隐式强制转换,从而帮助避免此类问题,那就太好了.

当然,存在一个问题,即对基本类型的操作对TypeAlias不可用,但可以通过扩展函数(或强制转换)来解决.

I don't want to use data classes, holding a single field, because it seems a bit of overkill, especially for primitive types (or maybe I am wrong and they'll be optimized out?)

So the question: can I somehow enforce type-safety for typealiases?

推荐答案

Update for Kotlin 1.3

从Kotlin1.3开始,内联类已经可用,目前被标记为试验性类.See the docs

原始答案

不幸的是,目前你无法避免这种情况.有一个正在开发的特性-inline classes (#9 in this document),它将解决运行时开销的问题,同时强制执行编译时类型安全.它看起来很像Scala's value classes,如果你有很多数据,它很方便,而普通的case类将是一个开销.

Kotlin相关问答推荐

用浮点数或十进制数给出错误答案的阶乘计算

jOOQ Kotlin Coroutines - Select all and exists查询

如何定义一个函数来接受任何具有特定字段的数据类

Kotlin-elvis算子don';不使用map.get()

Gradle:无法创建 ExtensiblePolymorphicDomainObjectContainer

修改器的属性是什么,我需要更改以使角变圆且宽度更小?喷气背包组合

如何从 var list 或可变列表中获取列表流

如何在 Hibernate Panache 中进行部分搜索

如何从 kotlin 函数中 Select 正确的枚举值

在 Kotlin 中,::class.simpleName是做什么的?

使用纯 Kotlin 函数作为 Junit5 方法源

从列表中的每个对象中 Select 属性

ActivityOptions.makeSceneTransitionAnimation 在具有多个视图的 kotlin 中不起作用

Kotlin:找不到符号类片段或其他 android 类

如何使用Kotlin Dokka记录主构造函数参数

Ktor 在 java.library.path 中没有 netty_transport_native_epoll_x86_64

面临一些未知问题一些后端jvm内部错误

在Kotlin中创建通用二维数组

如何在 IntelliJ IDEA 中禁用粘贴时将 Java 转换为 Kotlin?

var str:String是可变的还是不可变的?