ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ScalaコミュのLower Type boundsについて2

  • mixiチェック
  • このエントリーをはてなブックマークに追加
オベリスクさん  こんにちは

コメントに入りきらないので新しいトピックにしました

Scalaの型システムは結構頭を悩ませます。

私もいまだに頭の整理がついていませんが、LowerBoundsは共通の親をもつオブジェクト同士を扱った時に直近の親の型にしてくれるようなことを行いたい時に便利なもの。

もっと深い意味があるのかもしれませんが今のところの私の理解です。

以下にサンプルを載せます。


object LowerBounds extends Application{
val a: List[A] = List(new A);
val b: List[B] = List(new B);
val c = a ::: b;
println(c);
c(0).efg //List[A]とList[B]をつなげると直近の親であるABの方になる

val x = new X(new A)
val xx = x set(new B)
println(x)
xx.v.efg //X[AB]となる
//xx.v.bbb //エラーになる
}
class AB{
def abc = 100;
def efg = "aaaa"
}
class A extends AB{
override def abc = 1000;
def aaa = "A"
}
class B extends AB{
override def abc = 1;
def bbb = "B"
}
class X[+T](val v:T){
def set[TT >: T](e:TT):X[TT] = new X(e)
}


最初の例はListのケースです。
List[A]とList[B]をつなげると型指定しなくても直近の親であるList[AB]になります

二つめの例は自分で作成したXクラスの例です。
これもオブジェクトAをセットした「x」にオブジェクトBをsetメソッド経由で渡した時の「xx」はX[AB]になります。
従って「xx.v.bbb」はエラーになります。

コメント(1)

kanさん

おかげ様でやっと意味合いがわかってきました。ためしにつくってみました。
--------------------------------------
scala> abstract class Can[+A] {
| def openOr[B >: A](default: => B) : B = default
| }
defined class Can

scala> class Full[+A](value: A) extends Can[A] {
| override def openOr[B >: A](default: =>B) : B = value
| }
defined class Full

scala> class EmptyCan[+A](value:A) extends Can[A] {
| override def openOr[B >: A](default: =>B) : B = default
| }
defined class EmptyCan

scala> var a = new Full(new GoodPerson());
a: Full[GoodPerson] = Full@1319df3

scala> a.openOr(new BadPerson());
res38: Person = GoodPerson@503cb2

scala> a.openOr(new GoodPerson());
res39: GoodPerson = GoodPerson@503cb2

scala> a.openOr("string");
res40: java.lang.Object = GoodPerson@503cb2

-------------------------------------

なるほど。戻りが共通のスーパークラスに
なるわけですな。

このopenOrの戻り値の型は、普通で考えると、Can[+A] のAの型
になるのが普通っぽいので、本当にこのメソッドopenOrをLower type boundにする
理由は、本当に[B >: A]をつけないとコンパイルエラーになるからかもですね。
#ちなみにopenOrは中身を取り出すメソッドですな。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Scala 更新情報

Scalaのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング