【问题标题】:How to declare an extension val for Any type in Kotlin如何在 Kotlin 中为 Any 类型声明扩展 val
【发布时间】:2019-11-06 22:41:45
【问题描述】:

据我所知,Kotlin 中的Anyjava 中的Object 相似,默认情况下,我们声明的任何类都实现了它。我想把类名扩展成一个新的valclassTag。因此,

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

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

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

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

函数声明必须有名字

如何处理?

【问题讨论】:

  • 您的问题可以通过为您的变量提供 getter 方法来解决,例如:val Any.classTag: String get() { return this::class.java.simpleName }

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


【解决方案1】:

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

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

Kotlin Playground Example

【讨论】:

    【解决方案2】:

    这一行会有几个错误:

    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() 访问器。

    【讨论】:

    • 那么val Any.classTag: String get() = this::class.java.simpleNameval Any.classTag: String get() { return this::class.java.simpleName}有什么区别?
    • 其实没有。函数的赋值表达式只是一个简写。所以更短:val Any.classTag get() = this::class.java.simpleName。你甚至可以跳过返回类型。
    【解决方案3】:

    根据Kotlin Docs,Initializers are not allowed for 扩展属性。

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

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

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

    【讨论】:

      【解决方案4】:

      检查这个Extension Properties

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

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

      【讨论】:

        猜你喜欢
        • 2017-02-12
        • 1970-01-01
        • 2021-05-03
        • 1970-01-01
        • 2020-01-12
        • 2018-05-25
        • 2016-12-23
        • 1970-01-01
        • 2018-02-15
        相关资源
        最近更新 更多