質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

4回答

448閲覧

Kotlin nullなListにPlus()したときの動作について

web_sql

総合スコア4

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2024/06/06 11:35

編集2024/06/06 14:58

前提

kotlin

1var Test:List<Int>? = listOf(0) 2Test = Test?.plus(2) 3println(Test) 4//[0,2]

発生している問題

kotlin

1var Test:List<Int>? = null 2Test = Test?.plus(2) 3println(Test) 4//[null,2]になってほしいが、実際はnull

###知りたいこと

kotlin

1//以下の質問では 2var Test:List<Int>? = null 3//を前提として、この宣言は変更できないとする。 4 5//Q1 6//plus()を用いてprint(Test)で「[null,2]」と表示させるにはどうすればよいか? 7//それが不可能な場合、どのメソッドを使えばよいか? 8 9//Q2 10//もしかしてnullなListにどれだけplus()しても元のListはNullのままか?

kotlin

1var Test:List<Int>? = null 2Test = listOf() 3Test = Test?.plus(2) 4println(Test) 5 //[2] 6//Q3 7//以上のように、一度ListをlistOf()で初期化するとnullが消えるが、 8//listOf()のような初期化を使用せずにTestの要素からnullを消して「2」を追加するにはどうすればよいか

Q4 これはQ1~Q3の質問を要因をするに至ったプログラムソースです。

kotlin

1data class testclass(var a: String? = null, var b: Int? = null, var c:List<Int>? = null) 2 3fun main() { 4 var test1:testclass? = null 5 var test2 = testclass("100",50,null) 6 test2.c = listOf(10,20) 7 println(test2) 8 //testclass(a=100, b=50, c=[10, 20]) 9 //test2.cはnullだったのにlistOfで代入できている!?(nullは何を代入してもnullのままのはず・・・) 10 test1 = test2 11 println(test1) 12 //testclass(a=100, b=50, c=[10, 20]) 13 //test1はnullで、test1のすべてのプライマリコンストラクタもnullなのに代入できている!? 14}

・「nullに代入」はできているのに、なぜ「nullにplus()」はできないのか。
・上記のtest1 = test2Test = Test?.plus(2)=は違う働きをしているのか。

試したこと

もとはQ1を解決するためにいろいろ試していたが、その過程でQ2,Q3の疑問が生まれたため省略する。

補足情報(FW/ツールのバージョンなど)

Kotlin 1.9.24

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/06/06 11:58

Q1とQ3ですが、「何を目的として」そのようなことを行いたいのでしょうか?
web_sql

2024/06/06 12:16

訳あって詳しくは話せないないのですが・・・ ・Springbootを用いてWebアプリを作成している ・formを用いてDBからデータをListで取ってきたい ・そのListはform内でTest:List<(オブジェクト名)> = nullとして定義されていて、変更できない ・そのListにDBからとってきたデータを代入したい こんな感じですかね・・・。
maisumakun

2024/06/06 22:49 編集

> そのListはform内でTest:List<(オブジェクト名)> = nullとして定義されていて、変更できない 再代入できないのであれば、永遠にnullから変えることは不可能です。
guest

回答4

0

ベストアンサー

質問にある「nullなList」という物は存在しません。

kotlin

1var Test:List<Int>? = null

こうかくと、変数 Test はリストではなくnull そのものです。nullはリストではないので、リストのメソッドであるところの plus() も使うことができませんし、 そのときの Test に 2 を追加して [null, 2]にすることはそもそも不可能なのです。

逆に考えて、2を追加した結果が [null, 2] となるのは、 [null] 、ようするに1つのnullを要素にしたリストです。これはリストなので、plus(2)をすることができます。

kotlin

1 var Test: List<Any?> = listOf(null) 2 Test = Test.plus(2) 3 println(Test)

追記
コメントにあった以下の文

・そのListはform内でTest:List<(オブジェクト名)> = nullとして定義されていて、変更できない
・そのListにDBからとってきたデータを代入したい

先に書いたとおり、Testはnullで初期化されていますが、型からすると、本来はそのオブジェクトのリストのはずです。そのリストの要素にDBから取ってきたデータを入れるには、先にも書いたとおり、初期化で使われたnullは捨てて、新たに作ったリストを代入するしかありません。

kotlin

1Test = listOf<オブジェクト>()

として、以下でループでDBから取得した要素を追加。先頭にnullを残すかどうかは、実装に依存しますが、通常は不要でしょう。
そもそも、なぜnullで初期化するのかも意味がわかりませんし。

投稿2024/06/06 12:37

編集2024/06/06 14:56
TakaiY

総合スコア13337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

web_sql

2024/06/08 06:06

回答ありがとうございます。 非常に参考になりました。ありがとうございました。
guest

0

//Q1
//plus()を用いてprint(Test)で「[null,2]」と表示させるにはどうすればよいか?
//それが不可能な場合、どのメソッドを使えばよいか?

Q2,Q3は、意味不明なのでほかす。

$ kotlinc >>> var Test: List<Int?> = listOf() >>> Test = Test.plus(null) >>> Test = Test.plus(2) >>> println(Test) [null, 2]

投稿2024/06/06 12:10

shiketa

総合スコア4027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/06/06 12:23

前提条件を守っていない回答です。
web_sql

2024/06/08 06:06

回答ありがとうございます。 非常に参考になりました。ありがとうございました。
guest

0

maisumakun様、shiketa様、TakaiY様、ご回答ありがとうございました。
ご回答を参考にさせていただいたり、自分で調べていくうちに
かなりの勘違いや覚え間違いをしていたことが分かったので、ここでまとめておきます。

Q1,Q2

  • var Test:List<Int>? = nullと宣言するとTestはnullそのものであって[null]ではない
  • Listに対するplus()は要素を追加したリストを返すだけで、そのListそのものを変更しない

kotlin

1var Test1:List<Int> = mutableListOf<Int>(1) 2var Test2:MutableList<Int> = mutableListOf<Int>(1) 3 4Test1.plus(2) 5println(Test1)//1 6Test1 = Test1.plus(2) 7println(Test1)//(1,2) 8 9Test2.add(10) 10println(Test2)//(1,10)
  • Listに対してはadd()出来ない。mutableListならできる
  • Listに対してmutableListOfはできるが、これをしたからといってListの型はmutableListにはならない

kotlin

1var Test1:List<Int> = mutableListOf<Int>(1) 2Test1.add(109)//Unresolved reference 'add'.
  • nullそのものに対してadd()は出来るけど意味がない。plus()はそもそもエラーになる

(mutablelistに対してnullを代入するとList型として扱われる?)

kotlin

1var Test1:MutableList<Int>? = null 2 3Test1 = Test1?.plus(2) 4println(Test1)//Assignment type mismatch: actual type is 'kotlin.collections.List<kotlin.Int>?', but 'kotlin.collections.MutableList<kotlin.Int>?' was expected. 5 6Test1?.add(10) 7println(Test1)//null
  • ただし、nullに対して代入を行うことはできる。

kotlin

1test:Int= null 2test = 4 3print(test)//4 4var test2:MutableList<Int>? = null 5test2 = mutableListOf(10) 6print(test2)//[10]

Q3

そもそもvar Test:List<Int>? = nullと書いている時点でTestの要素はない(Testそのものがnull)
var Test:List<Int> = [null]なら以下のように書けば[null]を[2]にできる

kotlin

1var test2:MutableList<Int?> = mutableListOf(null) 2test2[0]=2 3print(test2)//[2]

Q4

  • 「nullに代入」はできているのに、なぜ「nullにplus()」はできないのか。

→[null]にplus()とnullにplus()は違うもの
[null]にplus()すれば[null,(追加した値)]だが、nullそのものにplus()してもlistそのものがないんだからplus出来ない

  • 上記のtest1 = test2とTest = Test?.plus(2)の=は違う働きをしているのか。

→同じであり、特に違う動きはしていない

投稿2024/06/08 06:06

編集2024/06/08 06:08
web_sql

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もしかしてnullなListにどれだけplus()しても元のListはNullのままか?

はい。?.でメソッドを呼ぶ場合、左辺がnullであれば何も起きません

投稿2024/06/06 11:58

maisumakun

総合スコア145628

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/06/06 22:45 編集

> 「nullに代入」はできているのに、なぜ「nullにplus()」はできないのか。 この回答の通り、nullに対して?.でメソッドを呼び出しても何も起きません。代入してオブジェクトを置き換えることは全く問題ありません。 > 上記のtest1 = test2とTest = Test?.plus(2)の=は違う働きをしているのか。 同じです。Test?.plus(2)の結果は(plusメソッドが呼ばれず)nullとなるので、再代入しても何も変化しないです。
maisumakun

2024/06/06 22:50 編集

> nullは何を代入してもnullのままのはず・・・ そんな事はありません(質問の追記では、「再代入すら行えない」という前提でのコメントでした)。
web_sql

2024/06/08 06:06

回答ありがとうございます。 非常に参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問