【发布时间】:2023-03-22 09:12:01
【问题描述】:
是否可以在 Kotlin 中重载强制转换运算符?
类似:
fun MyClass.cast(): String = this.toString()
fun MyClass.cast(): Int = this.hashCode()
fun MyClass.cast(): Map<String, MyClass> = mapOf(this.toString() to this)
然后我可以像这样使用它
val x: String = myClass as String
val y: Int = myClass as Int
val z: Map<String, MyClass> = myClass as Map<String, MyClass>
和
myClass is String // true
myClass is Int // true
myClass is Map<String, MyClass> // true
myClass is List<String> // false
【问题讨论】:
-
不,在 JVM 上进行强制转换不会创建新对象。它改变了 VM 看到相同对象的方式。
-
@Tenfour04 为什么我们必须不断重复这一点?我不明白为什么会有这么多的困惑... 但如果还不够清楚:在 Kotlin 中,强制转换不会将值转换为新类型;它向编译器保证该值已经属于该类型。 因此,如果不是,您将收到运行时错误。要进行转换,请使用转换方法,通常命名为
toXXX()。 -
@gidds 我遇到了这个问题,因为我想重构一个代码库,只需要很少的测试,从传递一个基本列表
到传递一个我可以提供自定义行为的 myTypeList。是的,似乎有理由不扩展基本列表。所以,我真的很想定义 cast to list 以返回包含原始列表的成员。如果我必须在任何地方添加 toList,这将不是一个容易的重构,而且代码实际上会在很长一段时间内变得不那么可读。 -
@SamuelÅslund 这种定制行为是否涉及改变现有方法的行为?如果没有,那么您可以通过在
List<MyType>上添加扩展方法来获得所需的内容。 — 但是演员表会是 `as MyList, which isn't significantly shorter than.toMyList()`,所以我不确定重新定义的演员表会给你什么。 (除非您的意思是 implicit 转换——在这种情况下,请查看 Scala 寻找打开的蠕虫包。)
标签: kotlin casting operator-overloading