2017-11-20 3 views
0

私は次のコードを実行しようとしますが、コードはコンパイル渡すことはできません、私はエラーを取得:Kotlinで「長時間のスマートキャストが不可能」というエラーが表示されるのはなぜですか?しかし、それはJavaでOkですか?

Smart cast to 'Long' is impossible, because 'i' is a mutable property that could have been changed by this time

なぜ?

class MyClass1(var i: Long?) { 

    fun change(): Long? { 
     if (i != null) { 
      return i + 10L 
     } else { 
      return 5L 
     } 
    } 
} 

コードMyClass2をJavaで作成しましたが、それはうまく動作します。なぜですか?

class MyClass2{ 
    private Long i; 

    public MyClass2(Long k){ 
     i=k; 
    } 

    public Long change(){ 
     if (i!=null){ 
      return i+10L; 
     }else { 
      return 5L; 
     } 
    } 
} 
+1

'i'は' change'にローカルではありません。だから、 'change'以外の何かが、ヌルチェックと' return'に 'i'を使うところで' i'を修正してしまった可能性があります。 – Michael

答えて

6

ivarあるので、それは理論的にはあなたのnullチェックとプラス操作の間に別のスレッドによって変更することができます。

let関数を使用して解決することができます。 iの値をletのパラメータとして「取得」します。

fun change(): Long? { 
    return i?.let { it + 10L } ?: 5L 
} 
+0

ありがとう!私は私の質問を更新しました。同じコードがJavaで書いてもうまく動作します。 – HelloCW

+0

@HelloCW Javaにはnull型の概念はありません。したがって、Kotlinコードと同じ問題があってもコンパイルされます。他のスレッドがヌルチェックとプラス操作の間で 'i'を' null'に変更すると、Javaコードが失敗します。 – marstran

+0

あなたのJavaコードとKotlinコードには違いがあります。あなたのKotlinコードでは、 'i'はpublicですが、あなたのJavaコードではprivateです。 – marstran