【问题标题】:Why I don't see companion object component of extended class?为什么我看不到扩展类的伴随对象组件?
【发布时间】:2017-03-04 09:40:23
【问题描述】:

我有一个抽象类:

abstract class Vec2t

还有一个扩展类:

class Vec2 : Vec2t

Vec2t 有以下companion object

companion object {

    @JvmField val length = 2
}

但是当我输入Vec2.length 时,它会被标记为未解析的引用...

为什么?我错过了什么?

【问题讨论】:

  • 你在说什么? Vec2t 中没有伴随对象,Vec2 的伴随对象看起来不像你上面给出的那样。
  • 我又检查了一遍,发现你的length 可能实际上命名为SIZE
  • 对不起,旧代码,我刚推了

标签: kotlin companion-object


【解决方案1】:

在 Kotlin 中,companion object 只是在你的类中特别标记的 object。你可以省略它的名字,它会得到默认的名字Companion,你还可以方便地使用MyClass.myProperty语法而不是MyClass.Companion.myProperty来访问它的成员。然而,它仍然只是一个嵌套的object

想象一下,如果它是一个常规的嵌套对象而不是一个同伴,事情会如何工作:

abstract class Vec2t {

    object LengthKeeper {
        val length = 2
    }

}

class Vec2 : Vec2t()

您可以通过Vec2t.LengthKeeper.length 访问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
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2018-09-12
    • 2019-03-26
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多