我知道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 }
函数声明必须具有名称
如何处理?
答案 0 :(得分:3)
您正在创建扩展属性,就好像它是一个函数一样。创建扩展属性的正确方法是定义属性的get和set方法。这是您应该做的:
val Any.classTag: String
get() = this::class.java.simpleName
答案 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)
请注意,由于扩展实际上并未将成员插入类,因此扩展属性没有有效的方法来拥有后备字段。这就是为什么扩展属性不允许使用初始化程序。只能通过显式提供getter / setter来定义其行为。
application/json