2015-10-13 74 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 
}