在Java中,我们可以这样做:
public class TestA {
public static final boolean flag = true;
public static final String str = flag ? "A" : "B"; // ok
}
但不能在Kotlin
class TestA {
companion object {
const val flag = true
const val str = if (flag) "A" else "B" //err: Const 'val' initializer should be a constant value
val str2 = if (flag) "A" else "B" //ok, but not equals [public static final] in Java.
}
}
在非const str2 上尝试 @JvmStatic ,但反编译为java代码,它是
private static final String str2 = "A"
public static final String getStr2() {
return Companion.getStr2();
}
问题:kotlin if-else 在java中等于?:,但不能用于 const val。需要解决方案。
答案 0 :(得分:12)
在Kotlin
中,const
关键字只应在值为编译时常量时使用。在你的情况下,它不是(const val str = if (flag) "A" else "B"
)。您正在使用if条件在非编译时间常量的条件下将值传递给str
。
因此,您只需删除const
关键字,即可完美运行。因为val
在Java中创建与final相同的不可变变量。但如果const
被删除,则需要权衡。它将在引擎盖下生成不必要的对象和getter以访问该变量。要解决此问题,请使用@JvmField
注释,您可以继续使用。
要了解详情,请转到Where Should I Keep My Constants in Kotlin?
希望它有所帮助。