如何为typealias的伴随对象定义扩展函数?

时间:2018-05-24 14:07:01

标签: kotlin

我认为typealiases与原始类型相同,只是一个不同的名称。

我认为typealiases与原始类型具有相同的引用。

typealias Celsius = Double

fun Double.Companion.foo() {} // Works
fun Celsius.Companion.foo() {} // Does not work

此处,Companion可以从Double访问,但Celsius会提供未解决的参考错误。

2 个答案:

答案 0 :(得分:2)

不,您无法通过typealias访问随播广告对象。一种可能的解决方法是为具体的伴侣创建一个更多的类型:

typealias CelsiusCompanion = Double.Companion

之后您可以按如下方式使用它:

fun CelsiusCompanion.foo() {}

答案 1 :(得分:1)

如果你想定义一个扩展函数,那就不可能像hluhovskyi已经说过的那样,但如果你只是想调用companion object的函数,情况会有所不同。

companion object中访问函数和属性有两种方法。您可以明确地或隐含地指定访问权限。隐式方法适用于typealias,显式方法不适用。

考虑这个最小的例子:

class ClassWithCompanion{
    companion object {
        fun sayHello() {
            println("Hello")
        }
    } 
}

typealias Alias = ClassWithCompanion

fun main(args: Array<String>) {
    ClassWithCompanion.sayHello() // implicit
    ClassWithCompanion.Companion.sayHello() // explicit 

    Alias.sayHello() // implicit (works)
    Alias.Companion.test() // explicit (does not work)
}