Почему я не вижу компонент сопутствующего объекта расширенного класса?

У меня есть абстрактный класс:

abstract class Vec2t

и расширяющийся класс:

class Vec2 : Vec2t

Vec2t имеет следующий объект-компаньон:

companion object {

    @JvmField val length = 2
}

Но когда я печатаю Vec2.length затем он помечается как неразрешенная ссылка...

Зачем? Что мне не хватает?

1 ответ

Решение

В Котлине companion object это просто специально отмеченный object внутри вашего класса. Вы можете опустить его имя, и оно получит имя по умолчанию Companionи вы также получаете удобство использования MyClass.myProperty синтаксис вместо MyClass.Companion.myProperty чтобы получить доступ к своим членам. Это, однако, все еще просто вложенный object,

Представьте, как все будет работать, если это будет обычный вложенный объект вместо компаньона:

abstract class Vec2t {

    object LengthKeeper {
        val length = 2
    }

}

class Vec2 : Vec2t()

Вы можете получить доступ к length с помощью Vec2t.LengthKeeper.length, но, конечно, вы не могли получить к нему доступ как Vec2.LengthKeeper.length, поскольку Vec2 класс не имеет вложенного объекта с именем LengthKeeper,

Маркировка переменной внутри объекта-компаньона @JvmStatic генерирует статическую переменную для length внутри Vec2t в байт-коде, но вы можете получить к нему доступ только из Java, где написание следующего действительно работает с вашим кодом:

Vec2 v = new Vec2();
int length = Vec2.getLength();

Что касается решения этой проблемы в Kotlin, если вам действительно нужно получить доступ к свойству базового класса через Vec2 с этим синтаксисом вам, вероятно, придется сделать что-то вроде этого:

class Vec2 : Vec2t() {

    companion object {
        val length get() = Vec2t.length
    }

}
Другие вопросы по тегам