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