我希望实现类Foo
的自定义转换功能,以便能够将其传递给需要Bar
对象的函数。
等效的C ++构造https://en.cppreference.com/w/cpp/language/cast_operator
class Foo {
operator Bar () {...}
}
答案 0 :(得分:0)
Kotlin没有隐式转换,这是有意设计的决定。您需要使其明确。您可以将负担加在呼叫者或接收者身上。
例如,如果我有:
class One()
class Two()
object Utilities {
fun foo(one: One) {
...
}
}
如果我要将Two
的实例传递给foo()
,我会:
// add extension function for explicit conversion:
fun Two.toOne(): One { ... convert my instance to other type }
// now caller must convert:
Utilities.foo(myTwo.toOne())
给定这个新的扩展功能来进行转换,上面的负担在调用者上进行转换。这是Kotlin处理标准库中所有内容的典型方式。
但是也许您想让它看起来更隐蔽,所以您还可以添加:
// add an extension to the callee, for implicit conversion:
fun Utilities.foo(two: Two) { foo(two.toOne()) }
// now caller doesn't have to convert:
Utilities.foo(myTwo)
现在,尽管调用者必须导入您的扩展功能,并且他们的IDE希望能为他们自动提出建议,但调用者再也看不到该转换。因此感觉很隐蔽,但是他们不得不选择使用该扩展名,这很容易做到。
请注意,以上extension functions的 none 都不需要对实际的类进行任何修改。这些扩展名可以单独导入,也可以整个包导入。它们可以独立于您执行或无法控制的类来完成。它们可以随时随地完成。
最终代码的全文:
// original classes
class One()
class Two()
object Utilities {
fun foo(one: One) {
...
}
}
// extensions
fun Two.toOne(): One {
// ... convert my instance to other type
}
fun Utilities.foo(two: Two) { foo(two.toOne()) }
现在您可以根据您的代码样式的需要使用任何一种模型。