ユーザ用ツール

サイト用ツール


kotlin:kotlinプログラミング

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
kotlin:kotlinプログラミング [2019/12/01 10:22]
ips [17.2 ジェネリック関数]
kotlin:kotlinプログラミング [2019/12/10 08:10] (現在)
ips
ライン 19: ライン 19:
  
 ===== 15.4 列挙クラス ===== ===== 15.4 列挙クラス =====
 +
 +
 +[[kotlin:​enumとsealed|]]
  
 <code kotlin> <code kotlin>
ライン 83: ライン 86:
 Class Class名<​T>​(xxxx:​T) Class Class名<​T>​(xxxx:​T)
  
-<​code>​+<​code ​kotlin>
 class LootBox<​T>​(var item:T) class LootBox<​T>​(var item:T)
  
ライン 122: ライン 125:
  
 ===== 17.3 複数のジェネリック型パラメータ ===== ===== 17.3 複数のジェネリック型パラメータ =====
 +
 +fun <R> 関数名():​R
  
 <code kotlin> <code kotlin>
ライン 264: ライン 269:
 </​code>​ </​code>​
  
 +===== 17.6.補足 in と out =====
 +
 +そもそも通常のインスタンスの場合は、上位クラス = 下位クラス は可能。
 +ジェネリック型の場合は、同じレベルのクラス = 同じレベルのクラス が基本(=不変)。
 +<code kotlin>
 +class LootBox<​T>​(val item:​T){ ​ //​inをつけるとvalやvarはつけれれない。プロパティとなり値を返してしまう(生産者)から。
 +}
 +
 +open class Loot(val value:Int)
 +class Fedora(val name:​String,​value:​Int):​Loot(value)
 +class Coin(value:​Int):​Loot(value)
 +
 +
 +fun main() {
 +
 +    // Loot型にcoin型をいれることはできる。
 +    val coinItem:​Coin = Coin(15)
 +    val LootItem:​Loot = coinItem
 +
 +    // ジェネリック型にcoin型をいれることはできない。不変!
 +    val coinBox = LootBox(Coin(20))
 +    val lootBox:​LootBox<​Loot>​ = coinBox // type mismatchでエラー。LootBox<​out T>​にする必要がある。
 +     ↓
 +    // キャストすることも可能だが、UnChecked Castと警告がでる。
 +    val lootBox:​LootBox<​Loot>​ = coinBox as LootBox<​Loot>​ 
 +}
 +</​code>​
 +
 +outはLootBox<​Loot>​型を指定して、LootBox<​Coin>​型のインスタンスがつくれないというはなしではない。
 +もしそうしても、LootBox<​Loot>​型のインスタンスが作成されるだけだ。
 +
 +LootBox<​Loot>​型のインスタンスにLootBox<​Coin>​型のインスタンスを代入できない。
 +<​Loot>​型なのに中身が<​Coin>​型や<​Fedora>​型になってしまうため。
 +
 +<code kotlin>
 +class LootBox<​T>​(val item:​T){  ​
 +}
 +
 +open class Loot(val value:Int)
 +class Fedora(val name:​String,​value:​Int):​Loot(value)
 +class Coin(value:​Int):​Loot(value)
 +
 +
 +fun main() {
 +    ​
 +    // outがなくてもLootBox<​Loot>​型でLootBox<​Coin>​型を作ることはできる。
 +    val lootBox1:​LootBox<​Loot>​ = LootBox(Coin(10)) ​
 +    val coin1:Coin = lootBox1.item ​ // エラー。Coin型の情報はなくなり、Loot型になっている。
 +    val coin2:Coin = lootBox1.item as Coin // キャストしてやれば取り出せる。
 +
 +    //​LootBox<​Coin>​でインスタンスを作成したものをLootBox<​Loot>​型に変換できない。
 +    val coinBox = LootBox(Coin(20)) ​
 +    val lootBox2:​LootBox<​Loot>​ = coinBox //​エラー。 LootBox<​out T>(val item:​T)にする必要がある。
 +     ↓
 +    // outをつけると下記コードは通り、LootBox<​Coin>​型からLootBox<​Loot>​へ変換される。
 +    val lootBox2:​LootBox<​Loot>​ = coinBox
 +}
 +</​code>​
 ===== 17.7 もっと知りたい? reifiedキーワード ===== ===== 17.7 もっと知りたい? reifiedキーワード =====
  
kotlin/kotlinプログラミング.1575163352.txt.gz · 最終更新: 2019/12/01 10:22 by ips