この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
kotlin:kotlinプログラミング [2019/12/01 13:37] ips [17.6.補足 in と out] |
kotlin:kotlinプログラミング [2019/12/10 08:10] (現在) ips |
||
---|---|---|---|
ライン 19: | ライン 19: | ||
===== 15.4 列挙クラス ===== | ===== 15.4 列挙クラス ===== | ||
+ | |||
+ | |||
+ | [[kotlin:enumとsealed|]] | ||
<code kotlin> | <code kotlin> | ||
ライン 288: | ライン 291: | ||
val coinBox = LootBox(Coin(20)) | val coinBox = LootBox(Coin(20)) | ||
val lootBox:LootBox<Loot> = coinBox // type mismatchでエラー。LootBox<out T>にする必要がある。 | val lootBox:LootBox<Loot> = coinBox // type mismatchでエラー。LootBox<out T>にする必要がある。 | ||
+ | ↓ | ||
+ | // キャストすることも可能だが、UnChecked Castと警告がでる。 | ||
+ | val lootBox:LootBox<Loot> = coinBox as LootBox<Loot> | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | outはLootBox<Loot>型を指定して、LootBox<Coin>型のインスタンスがつくれないというはなしではない。 | ||
+ | もしそうしても、LootBox<Loot>型のインスタンスが作成されるだけだ。 | ||
+ | |||
+ | LootBox<Loot>型のインスタンスにLootBox<Coin>型のインスタンスを代入できない。 | ||
+ | <Loot>型なのに中身が<Coin>型や<Fedora>型になってしまうため。 | ||
<code kotlin> | <code kotlin> | ||
ライン 303: | ライン 315: | ||
| | ||
// outがなくてもLootBox<Loot>型でLootBox<Coin>型を作ることはできる。 | // outがなくてもLootBox<Loot>型でLootBox<Coin>型を作ることはできる。 | ||
- | // | ||
val lootBox1:LootBox<Loot> = LootBox(Coin(10)) | val lootBox1:LootBox<Loot> = LootBox(Coin(10)) | ||
val coin1:Coin = lootBox1.item // エラー。Coin型の情報はなくなり、Loot型になっている。 | val coin1:Coin = lootBox1.item // エラー。Coin型の情報はなくなり、Loot型になっている。 | ||
ライン 309: | ライン 320: | ||
//LootBox<Coin>でインスタンスを作成したものをLootBox<Loot>型に変換できない。 | //LootBox<Coin>でインスタンスを作成したものをLootBox<Loot>型に変換できない。 | ||
- | val coinBox = LootBox(Coin(20)) | + | val coinBox = LootBox(Coin(20)) |
val lootBox2:LootBox<Loot> = coinBox //エラー。 LootBox<out T>(val item:T)にする必要がある。 | val lootBox2:LootBox<Loot> = coinBox //エラー。 LootBox<out T>(val item:T)にする必要がある。 | ||
+ | ↓ | ||
+ | // outをつけると下記コードは通り、LootBox<Coin>型からLootBox<Loot>へ変換される。 | ||
+ | val lootBox2:LootBox<Loot> = coinBox | ||
} | } | ||
</code> | </code> |