为什么下面的第一个代码示例会编译,而第二个代码却失败。唯一的变化是我将涉及的val从文件范围移到了类范围。 longArrayOf(...)创建一个LongArray,对吗?
编译没有问题:
val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
class TestLongArrayOf {
enum class BuzzType(val pattern: LongArray) {
CORRECT(CORRECT_BUZZ_PATTERN)
}
}
出现消息“未解析的引用CORRECT_BUZZ_PATTERN”失败
class TestLongArrayOf {
val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
enum class BuzzType(val pattern: LongArray) {
CORRECT(CORRECT_BUZZ_PATTERN)
}
}
最佳答案
主要区别在于,在第一种情况下,CORRECT_BUZZ_PATTERN
是在类外部定义的,并且被视为只读变量(可通过其getter访问),而在第二个片段中,它是只读的实例变量,因此不能用作常数。
但是,此代码将起作用:
class TestLongArrayOf {
val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
enum class BuzzType(val pattern: LongArray) {
CORRECT(TestLongArrayOf().CORRECT_BUZZ_PATTERN)
}
}
让我们看一下生成的字节码。在第一种情况下,您具有:
public final class MainKt {
private final static long[] CORRECT_BUZZ_PATTERN
public final static long[] getCORRECT_BUZZ_PATTERN() {
...
}
static {
// initialize CORRECT_BUZZ_PATTERN here
...
}
}
public final enum TestLongArrayOf$BuzzType {
...
}
因此,CORRECT_BUZZ_PATTERN是属于
static final
类的MainKt
数组,可以通过其getter对其进行访问。在第二种情况下,您得到的是:
public final class TestLongArrayOf {
private final long[] CORRECT_BUZZ_PATTERN
public final long[] getCORRECT_BUZZ_PATTERN() {
...
}
}
public final enum TestLongArrayOf$BuzzType {
...
}
请注意,在这种情况下,
CORRECT_BUZZ_PATTERN
是一个实例变量,可以通过其getter进行检索。但是,由于它是一个实例变量,因此必须在TestLongArrayOf
实例上调用getter,这就是为什么我的答案顶部的代码段有效的原因。
关于kotlin - kotlin…ArrayOf范围界定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56316036/