我们如何在Java注解声明中引用Kotlin常量?

13

考虑到以下 Kotlin 代码:

object OldTownRoad {
  const val COWBOY_HATS = "from Gucci"
  const val WRANGLER = "on my booty"
}

以及这个Java类:

public class Scrap {
  @Named(OldTownRoad.COWBOY_HATS)
  public void lilNasXrefs() {
    System.out.println(OldTownRoad.COWBOY_HATS);
    System.out.println(OldTownRoad.WRANGLER);
  }
}
编译器在println()调用时非常高兴。它对@Named注释中使用COWBOY_HATS表示“属性值必须是常量”感到不满,如Android Studio 3.5.3截图所示: Kotlin error 我尝试在这些const val声明上使用@JvmStatic@JvmField,但编译器抱怨两者都不适用于const属性。
companion object获得相同的结果:
class OldTownRoad {
  companion object {
    const val COWBOY_HATS = "from Gucci"
    const val WRANGLER = "on my booty"
  }
}

是否有其他 Kotlin 常量语法可在从 Java 注释中引用时起作用?


最终的val是什么? - Rick Sanchez
@RickSanchez: final const val 的结果是“final 是一个冗余修饰符”。这样做也不能解决问题。 - CommonsWare
@natario:Kotlin 1.3.61 - CommonsWare
@natario:感谢您指出无法重现此问题!看起来这是一个流氓的Android Studio检查错误——代码编译正常。 - CommonsWare
我也同时使用Kotlin 1.3.61,它对我来说很好用(https://ibb.co/mG7XP6n)。尝试检查依赖关系?我有```implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"implementation 'javax.inject:javax.inject:1'```。 - alvinalvord
显示剩余2条评论
1个回答

11

我忘记查看这是否是一个Android Studio的bug了。 :facepalm:

事实证明,如果你运行代码,它会正常运行。Android Studio 3.5.3似乎是在无谓地抱怨。

我提交了一个bug报告,试图获得问题的确认。

非常感谢@natario的评论,让我意识到这可能是一个IDE问题!


很酷!就我所知,我正在使用稍旧的AS版本(仍然是3.5)。 - natario
哦,我明白了!我也有一个旧版本,3.3.2。 - alvinalvord
1
从Kotlin 1.3.70开始,这个问题已经得到解决(在Android Studio 3.6.1中)。 - Matthew Bahr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接