2015-10-13 5 views
9

最近私はKotlin langとjavaとの相互運用性について調べてきました。私は、次のしているJavaコード:java switch式で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ステートメントでkotlinの定数を使用する方法ですか?

私はjdk8とkotlin M14を使用しています。

+0

私はkotlinについて知らない。しかし、javaでは、コンパイル時にスイッチの定数を知る必要があります。したがって、コンパイル時に割り当てられた最終/定数フィールドは、switch文では使用できません。 –

+0

@Pinkieええ、Javaコードのどこかで 'static final'として' CONSTANT_ONE'を宣言すれば、私はそれをswitch文で使うことができます。しかし、私はそれが今よりももっと厳しい方法でコトリンに書き込むことができたかどうかわかりません。 – Mikhail

+1

M14は状態を変更します。「M14では、Kotlin定数に注釈で使用できるようにKotlin定数に接頭辞を付け、Javaのフィールドとして表示する必要があります」 –

答えて

19

M14は

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

IntelliJのはまだJavaのケースでは私にエラーを示し、「私たちはJavaからフィールドとして注釈でそれらを使用して見ることができるようにするためのconstでKotlin定数の前に付ける必要があるM14ので、」状態を変更しますコンパイルして動作します。

+0

はエラーを表示し、コンパイルしません。... –

+0

まだ見ていますIntelliJ IDEA 2016.1.3/Kotlin 1.0.2-release-IJ145-10のエラー(Constant expression required)がコンパイルされ、私のために働きます(奇妙です) –

+0

Kotlin 1.0.3に修正が来ているようです: https://youtrack.jetbrains.com/issue/KT-12026 –

0

もっと簡単な解決策は次のようになります。 基本的に彼らはどこにでも適切で参照することができるクラスの範囲外の定数を宣言し、される代わりに、「Kotlinクラス」のKotlinファイル '、で定数を宣言します輸入。

const val CONSTANT_ONE = 1 
const val CONSTANT_TWO = 2 

class Service { 
} 

それとも、private static final int CONSTANT_ONE = 1;

に似て何かをしたい場合は、Kotlinファイルにプライベートであることを、定数を宣言することができ、かつ同一ファイル内のクラスだけがそれにアクセスしてきました。

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

class B{ 
    // can access CONSTANT_ONE 
} 
関連する問題