Почему я не вижу компонент companion object расширенного класса?
У меня есть абстрактный класс:
И расширяющийся класс:
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 } }