LL脳がscalaの勉強を始めたよ その70
Scalaコップ本の19章の続きをやっていきますよー、今回も変位指定アノテーションについてのアレやコレとしてコンパイラの動作についてやっていきますよー
変位指定アノテーションのチェック
Scalaコンパイラはクラスやトレイト内で型パラメータを使える全ての場所(ポジション)を次の3つに分類するようです。各分類については後述されますな。
- 陽性
- 陰性
- 中性
例えばメソッドの値パラメータなんかも型を持っているので、クラスやトレイトの型パラメータがそこに現れる可能性があるのでメソッドの値パラメータもポジションと呼べるんですな…(´ε`;)ウーン…型が絡みそうであれば全部ポジションってことでOKですかね(´・ω・`)
ポジションの変化
コンパイラによる分類方法としてはトップレベルポジションは陽性から開始されるそうで、基本的にポジションの性質はネストされた中でも保持されるらしいです。
ただしメソッドの値パラメータのポジションではメソッドの外のポジションが陽性⇒陰性のように反転するみたいです(´・ω・`)、当然逆もしかりで陰性⇒陽性のようになるのですね、まあ中性は中性のままらしいんですが(゚Д゚)
またメソッドの型パラメータも変位指定次第では反転するとのこと…例えばとある型パラメータが+アノテーションを持つ場合の分類は変わらないですが、-アノテーションを持つ場合は反転するそうです。また変位指定パラメータを持たない場合は中性に変わるのだとか…うん、ちょっと頭が爆発しそうですな(´・ω・`)
まあサンプルでもやっとくかな
とりあえずワケが分からなくなってきたので、ポジションの変化のサンプルを写経してみますよ。変位指定が解りやすいように各ポジションの変位指定を(+)と(-)で書いておりますです
abstract class Cat[-T, +U]{ def meow[W(-)](volume:T(-),listener:Cat[U(+),T(-)](-)):Cat[Cat[U(+),T(-)](-),U(+)](+)
上記meowメソッドのパラメータのポジションの状態を羅列してみますねー
- 型パラメータWのポジションは陰性
- meowの2つの値パラメータ(volumeとlistener)は陰性
- meow の結果型Catは陽性
- Catの第1パラメータCat[U(+),T(-)](-)は-アノテーションが付いているので陰性
- またCat[U(+),T(-)](-)の第1パラメータは反転して陽性になる
- またCat[U(+),T(-)](-)の第2パラメータは反転して陰性のまま
…うん、さっぱり分けがわからんす(´;ω;`)とりあえず変位指定でポジションがコロッコロ変わるのね…という感覚ぐらいですかね