質問内容
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