質問内容
Scalaで以下の2つの定義の違いはなんでしょうか?
型のエイリアスに共変が必要になる理由が知りたいです。
scala
1type L1[A] = scala.collection.immutable.List[A]
scala
1type L2[+A] = scala.collection.immutable.List[A]
非変のL1[A]を使っても、共変L2[+A]を使っても以下のコードがコンパイルも通って、実行も可能でした。
scala
1object Main extends App { 2 type L1[A] = scala.collection.immutable.List[A] 3 type L2[+A] = scala.collection.immutable.List[A] 4 5 6 val a: L1[String] = List("apple", "orange", "melon") 7 val b: L1[CharSequence] = a // 定義可能です 8 9 10 val c: L2[String] = List("apple", "orange", "melon") 11 val d: L2[CharSequence] = c // 定義可能です 12 13 println("実行もOK") 14}
Ideoneで確認できます(https://ideone.com/ODNPYa)
package object scalaで定義されているListはL2と同じ定義で、List[+A] = scala.collection.immutable.List[A]になってるみたいです。
あと、反変のL3[-A]だと流石にコンパイルは通りませんでした。
L1[A]とL2[+A]の違いが現れるときは、どんなコードでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/01 04:29