2017-07-11 8 views
3

は、私がデータクラスフィールドを自身の非ヌルバージョンにキャストできますか?

data class MyModel(private val _data: MyData? = null) 

を持っており、それがnull、それ以外投げないとき、私は私のデータのみアクセス可能であることを確認します。 私は以下のものを使用しています。私は以下の苦情をOverride getter for Kotlin data classごとなどのガイドに従うならば、それはfieldが非にキャストすることができないというのは本当です

fun getData(): MyData { 
     return checkNotNull(_data) { "data shouldn't be null" } 
    } 

しかし、私の代わりにMyData

val data = _data 
    get(): MyData { 
     return checkNotNull(field) { "data shouldn't be null" } 
    } 

MyData?を返却する必要がありますそれが返ってきたらヌルバージョン?

答えて

2

Anyを返すAny?プロパティのゲッターを宣言することが目的なら、それは不可能です。次のエラーを取得します:

Getter return type must be equal to the type of the property

だから働かない

val test : String? 
    get() : String = "hi" 

ような何かをしようとします。


ただし、NULL可能財産を隠し、鋳造を経てNULL可能値を参照する非NULL可能プロパティ公開することができます:

private val test : String? = "hi" 
val testNotNull : String = test as String 

参照nulltest場合は、例外がスローされますが。例えば

:あなたは、これは安全ではありませんが、これはtry.kotlin.org

で実施snippitテストすることができ

fun main(args: Array<String>) = print(Demo().testNotNull) 

class Demo(private var test: String? = "hi") { 
    val testNotNull : String 
.  get() = test as String 
} 

。あなたはデザインを考え直すべきです。 Javaと相互運用していない場合は、null可能な型で自分自身を罰するべきではありません。

+0

通常の変数については、可能です。フィールドでは、 "field as String"を試してみてください。クラス変数のカスタムゲッターとしてテストしてください、あなたは私が何を意味するかを見ていきます。 – Elye

+0

@Elye Worksもフィールド用です。私の更新をチェックしてください。 –

+0

こんにちは@Vince、それは 'フィールド'ではありません。それは別の変数からその変数にキャストしているだけです。しかしそれは素晴らしいトリックでもあります。 Upvoteも同様に:) – Elye

0

それは必ずしもあなたがMyData?

"のようにそれをキャストした場合のMyDataクラスがnullであることを意味するものではありませんか? '実行時に例外を回避するために、実際にnullになるインスタンスでオブジェクトをnullにすることができます。

あなたのクラスをnullにすることができますし、それでもあなたのデータを含むことができます。

+0

getData()を呼び出す関数では、null以外の項目が必要です。したがって、nullでないことを確認する必要があります。私は伝播したくないのですか?呼び出し元に至るまで。私は "!!"を使いたくありません。 – Elye

+0

ああ私は私の携帯電話で申し訳ありませんが見逃して表示されます – ganjeii

1

私はあなたができるとは思わない。 fun getData()で行ったことは、有効なアプローチのIMOです。または、データクラスを使用して通常のクラスを作成することはできません。

typealias notNullType = MyData 

data class Test(private val _value: MyData? = null) { 
    val v: notNullType = _value as notNullType 
    get() { return field } 
} 

これは完全にあなたができるようになる::私はそれが仕事かもしれないと思う何

はこのようなものであるBEINGは言っ

fun play() { 
    val t = Test(null) 
    print(t.v) //see what I did? :-) 
} 

...私は「考えていません「?を隠す」オプションは、必然的に良いアイデアです。

+1

素敵なトリックです。しかし、単に 'val t = Test(null)'によってさえ、それはクラッシュします。おそらくそのような場合には、上記のように 'fun getData()'アプローチを使って基本的なものに戻ってください。あなたにアップヴォートを与えてください:) – Elye

+0

問題は、フィールドがnullであるという事実を隠そうとしていることです。それは、あなたが言及したクラッシュへの扉を開く、それが始まる「約束」を破るものです。 'data'クラスに"カスタムロジック "を追加したい場合は、それを追加しなければなりません(あなたの' getData() '関数は良い例です)、そうでなければコンパイラのチェックメカニズムをオーバーライドしようとしています。 –

+0

私は "?"を隠すつもりはありませんが、アクセス時にnullであればクラッシュします。つまり、 'checkNotNull(field){"データヌル "}"であってはなりません。それがアクセスできない場合は、大丈夫ですが、クラッシュしないでください。 – Elye

関連する問題