如何实现自定义转换

时间:2018-11-20 16:35:03

标签: kotlin type-conversion

我希望实现类Foo的自定义转换功能,以便能够将其传递给需要Bar对象的函数。

等效的C ++构造https://en.cppreference.com/w/cpp/language/cast_operator

class Foo {
    operator Bar () {...}
}

1 个答案:

答案 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()) }

现在您可以根据您的代码样式的需要使用任何一种模型。