【问题标题】:Overload cast operator in KotlinKotlin 中的重载强制转换运算符
【发布时间】: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&lt;MyType&gt; 上添加扩展方法来获得所需的内容。 — 但是演员表会是 `as MyList, which isn't significantly shorter than .toMyList()`,所以我不确定重新定义的演员表会给你什么。 (除非您的意思是 implicit 转换——在这种情况下,请查看 Scala 寻找打开的蠕虫包。)

标签: kotlin casting operator-overloading


【解决方案1】:

不,这是不可能的。你不能通过铸造来做到这一点;您只能使用执行转换的显式函数来执行此操作。

【讨论】:

  • 太糟糕了。一些有趣的事情是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
相关资源
最近更新 更多