Skip to content

Instantly share code, notes, and snippets.

@ezura
Created June 10, 2017 05:34
Show Gist options
  • Select an option

  • Save ezura/814106ed6a95de751c4f7f2d7f9b69f1 to your computer and use it in GitHub Desktop.

Select an option

Save ezura/814106ed6a95de751c4f7f2d7f9b69f1 to your computer and use it in GitHub Desktop.
うむむ。例を見た感じ、Swift は Array が Value type だから共変になれてるのかな… #u_scala #swift #CodePiece
let strings: Array<String> = ["", ""]
var anys: Array<Any> = strings
anys[0] = 1
@ezura
Copy link
Copy Markdown
Author

ezura commented Jun 25, 2017

要素型から配列型を構築する演算子は、通常、基本型に対し共変である。すなわち String ≤ Object ならば ArrayOf(String) ≤ ArrayOf(Object) である。ただしこれは配列がイミュータブルである場合に限って正しい (型安全である)。配列に対する追加演算子 (要素を配列に追加する) と取出演算子 (要素を配列から取り出す) が許される場合、追加演算子は共変 (例えば String を ArrayOf(Object) に追加できる) であるのに対し、取出演算子は反変 (例えば ArrayOf(String) から Object を取り出せる) である。このように共変性と反変性が競合するため、ミュータブルな配列は基本型に対して不変にすべきである。
(https://ja.wikipedia.org/wiki/%E5%85%B1%E5%A4%89%E6%80%A7%E3%81%A8%E5%8F%8D%E5%A4%89%E6%80%A7_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%A6))
"共変性と反変性が競合"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment