2017-10-06 3 views
3

numはnullableに設定する必要がありますが、返される値は常にnull値ではありません(デフォルト値)。バッキングフィールドがnullの場合でもgetterをnull以外の型を返すように設定すると、

class Test { 
    var num: Int? = null 
     get() = field ?: 5 // default value if null 
} 

次は型がバッキングフィールドから推測されるが、取られていないため、返される値は、私には理にかなっている、常にnull以外であってもコンパイルされません:

val a: Int = Test().num 

を型不一致:推論型はIntですか?しかし、Intが期待されました

私はそのゲッターの戻り値の型をnull値ではないように変更することはできますか?私はそうした場合、コンパイラは言う:

ゲッターの戻り値の型は、すなわち 「のInt?」プロパティのタイプと同じでなければなりません


私は(バッキングフィールドのない)別のプロパティnumNotNullableでそれを解決できることを知っています。

class Test { 
    var num: Int? = null 
     get() = field ?: 5 // default value if null 

    val numNotNullable: Int 
     get() = num ?: 5 
} 

val c: Int = Test().numNotNullable 

しかし、これは私が望むものではありません。 別の方法がありますか?

+0

安全だと知っているので、技術的には「.num !!」を使用できます。それは素晴らしいことではありませんが、この場合はまだ安全です。 – chris

+0

あなたのバッキングプロパティソリューションは間違いなく正しいものです。機能要求を見つけるためのドキュメントhttps://kotlinlang.org/docs/reference/properties.html#backing-properties – zsmb13

答えて

5

var num: Int? = null

これはあなたの財産の署名です。 null値が返されないように内部的に確認しても問題ありません。シグネチャには、その値はnull可能であることが示されています。

これは暗示:

  • あなたはこのフィールド
  • すべてのクラス、プロパティが持つnull

ソリューションを返すことができるという事実を処理する必要があり、このフィールドを使用してnullを設定することが許可されています第2の特性は良好である。

もちろん、普通の古いJava beanとプロパティを置き換えることはできますが、getNumbsetNumという小道具にアクセスする必要があるため、私はそれを知らせません。

class Test { 
    private var num: Int = 5 

    fun setNum(num: Int?) { 
     this.num = num ?: 5 
    } 

    fun getNum() = num 
} 
3

私はこれがKotlinでは可能ではないと思います。 get/setのプロパティの型をオーバーライドすることはできません。したがって、あなたの財産がInt?の場合は、Int?を返却し、それを使用するときにnullであるかどうかを確認する必要があります。

あなたが探しているものは技術的にはfeature requestですが、作成されてから数年経っています。

+0

のバッキングプロパティの例です –

関連する問題