2015-10-13 73 views
9

最近我一直在研究Kotlin lang,并与java进行了互操作。我有以下的Java代码:在java开关表达式中使用kotlin常量

public void select(int code) { 
    switch code { 
     case Service.CONSTANT_ONE: 
      break; 
     case Service.CONSTANT_TWO: 
      break; 
     default: 
      break; 
    } 
} 

Service.kt写成如下:

class Service { 
    companion object { 
     val CONSTANT_ONE = 1 
     val CONSTANT_TWO = 2 
    } 
} 

Java编译器说,CONSTANT_ONE和CONSTANT_TWO必须是常量,但我不知道,我怎么才能让他们更不变的比现在。所以我的问题是:如何在java swicth语句中使用来自ko​​tlin的常量?

我正在使用jdk8和kotlin M14。

+0

我不知道kotlin。但是在java中,编译时必须知道开关情况常量。因此,在编译期间分配的最终/常量字段不能用在switch语句中。 –

+0

@Pinkie是啊,如果我在java代码中声明'CONSTANT_ONE'为'static final',我可以在switch语句中使用它。但是我不知道如何在Kotlin中以更严格的方式写出比现在更多的信息。 – Mikhail

+1

M14改变状态“自M14以来,我们需要在const中加上Kotlin常量,以便能够在注释中使用它们,并将它们看作Java的字段” –

回答

19

M14改变状态“由于M14,我们需要用常量前缀科特林常数能在注释中使用它们,看看从Java字段”

class Service { 
    companion object { 
     const val CONSTANT_ONE = 1 
     const val CONSTANT_TWO = 2 
    } 
} 

的IntelliJ仍显示我的错误在Java的情况下但它编译和工作。

+0

显示错误并且不会编译.... doh ... –

+0

仍然看到在IntelliJ IDEA 2016.1.3/Kotlin 1.0.2-release-IJ145-10中出现错误(需要常量表达式),但它确实为我编译和工作(奇怪!) –

+0

Kotlin 1.0.3中看起来像一个修复程序: https://youtrack.jetbrains.com/issue/KT-12026 –

0

一个更简单的解决办法是: 在“科特林文件”声明常量,而不是“科特林级”,这基本上宣告类范围外的常数和他们可以在任何地方引用适当进口。

const val CONSTANT_ONE = 1 
const val CONSTANT_TWO = 2 

class Service { 
} 

或者,如果你想在同一文件中的东西是相似private static final int CONSTANT_ONE = 1;

可以声明常量是在科特林文件公开,只有类具有访问它。

private const val CONSTANT_ONE = 1 
class A{ 
    // can access CONSTANT_ONE 
} 

class B{ 
    // can access CONSTANT_ONE 
}