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) }
おかげ様でやっと意味合いがわかってきました。ためしにつくってみました。
--------------------------------------
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