如何在Kotlin中为任何类型声明扩展值

时间:2019-06-25 06:41:00

标签: android inheritance kotlin extension-methods dependency-properties

我知道Any中的Kotlin类型与Object中的java类似,默认情况下,该类型是由我们声明的任何类实现的。我想将类名称扩展为新的val classTag。因此,

当我扩展一个函数时,它工作正常,

fun Any.getClassTag(): String { return this::class.java.simpleName }

但是,当我扩展val类型时,我发现编译器错误。

val Any.classTag: String { return this::class.java.simpleName }
  

函数声明必须具有名称

如何处理?

4 个答案:

答案 0 :(得分:3)

您正在创建扩展属性,就好像它是一个函数一样。创建扩展属性的正确方法是定义属性的get和set方法。这是您应该做的:

val Any.classTag: String
    get() = this::class.java.simpleName

Kotlin Playground Example

答案 1 :(得分:3)

这一行会出现一些错误:

Error:(1, 0) Extension property must have accessors or be abstract
Error:(1, 23) Property getter or setter expected
Error:(1, 24) Expecting a top level declaration
Error:(1, 25) Function declaration must have a name
Error:(1, 34) 'this' is not defined in this context

这是因为您没有正确声明访问器:

val Any.classTag: String get() { return this::class.java.simpleName }

您只需在块之前添加get()访问器。

答案 2 :(得分:2)

  

根据Kotlin Docs,不允许初始化   扩展属性。

因此,为扩展属性提供价值的唯一方法是显式提供 getter / setters

在您的情况下,应如下所示:

<div id="container">
    <div id="map1">
        <app-map>
            <app-map-control></app-map-control>
        <app-map>
    </div>

    <div id="map2">
        <app-map>
            <app-map-control></app-map-control>
        <app-map>
    </div>
</div>

答案 3 :(得分:1)

选中此Extension Properties

  

请注意,由于扩展实际上并未将成员插入类,因此扩展属性没有有效的方法来拥有后备字段。这就是为什么扩展属性不允许使用初始化程序。只能通过显式提供getter / setter来定义其行为。

application/json