僕が2015/5/14に書いた型パラメータに関するエントリがすごく間違っている気がする
数日前の記事(共変とか反変とかわからないので躓いている - 趣味プログラマがまれになんかしたことの記録 )にて、僕は下のように書いたけど、
def get[A >: Any](i:Int):K[A]
これは下限境界というやつで、AnyまたはAnyのスーパークラスのみ型パラメータに指定できる、という意味らしい。では僕が使いたかったのはこれじゃなくて、Anyのサブクラスならなんでも許す、という動きを期待していたので、本当は以下の上限境界というものだと思う。
def get[A <: Any](i:Int):K[A]
こっちが正しいのかもしれないと思って実際に上限境界(
class A {def name = "A"} class B extends A {override def name = "B"} class C extends B {override def name = "C"} def showName[X <: B](x:X) = x.name showName(new B) // --> OK showName(new C) // --> OK showName(new A) // --> NG but expected
XはBと同じかBのサブクラスだから、B、Cでは動くがAでは動かない。ここまではいい。
def showName2[X >: B](x:X) = x.name <console>:9: error: value name is not a member of type parameter X def showName2[X >: B](x:X) = x.name
エラーになる理由はわかる。Bのスーパークラスはnameというメソッドを持たないかもしれないからだ。
となると、この下限境界ってどういう時に使えるのか、さっぱりわからなくなってしまった。
以下のエントリが参考になりそう。
第21章:Scalaの型パラメータ - Qiita
(皿うどん)Structural Subtyping(構造的部分型)アレコレ - ( ꒪⌓꒪) ゆるよろ日記
JavaのGenericsよりも便利なScalaの型パラメータ (1/2):スケーラブルで関数型でオブジェクト指向なScala入門(8) - @IT
Scalaジェネリクスメモ(Hishidama's Scala parameterized type Memo)
古い版のだけど、コップの本があるので読みなおしてみよう。
こういういろいろなことで躓いて実際の開発が進まないという罠にハマってしまっているなあ。
2015/05/20 15:14 追記
いろいろ考え込んでいたが、大いに間違いであることがわかった。
こっち参照--> 返ってくる型がわからないときは、Anyを使う? - 趣味プログラマがまれになんかしたことの記録