Как объявить расширение val для любого типа в Kotlin - PullRequest
0 голосов
/ 25 июня 2019

Как я знаю, тип 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 ]

3 голосов
/ 25 июня 2019

В этой строке будет несколько ошибок:

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() аксессор перед вашим блоком.

3 голосов
/ 25 июня 2019

Вы создаете свойство расширения, как если бы оно было функцией. Правильный способ создать свойство расширения - определить методы get и set для свойств. вот что вы должны были сделать:

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

Пример игровой площадки Kotlin

2 голосов
/ 25 июня 2019

Согласно Документам Kotlin , инициализаторы не допускаются для свойства расширения.

Таким образом, единственный способ указать значение для свойства расширения - явное указание getters / setters .

В вашем случае это должно быть так:

val Any.classTag: String 
    get() { 
        return this::class.java.simpleName
    }
1 голос
/ 25 июня 2019

Проверьте это Свойства расширения

Обратите внимание: поскольку расширения на самом деле не вставляют члены в классы, эффективного свойства для свойства расширения иметь вспомогательное поле не существует. Вот почему инициализаторы не допускаются для свойств расширения. Их поведение может быть определено только путем явного предоставления методов получения / установки.

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