blob: c220e85350cfc79feebf1fb5f9aa780d4d572840 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
// Martin: I am not sure this is a solvable problem right now. I'll leave it in pending.
// derived from pos/t1001
class A
trait B[T <: B[T]] extends A
class C extends B[C]
class D extends B[D]
class Data {
// force computing lub of C and D (printLubs enabled:)
/*
lub of List(D, C) at depth 2
lub of List(D, C) at depth 1
lub of List(D, C) at depth 0
lub of List(D, C) is A
lub of List(D, C) is B[_1] forSome { type _1 >: D with C <: A }
lub of List(D, C) is B[_2] forSome { type _2 >: D with C{} <: B[_1] forSome { type _1 >: D with C{} <: A } }
*/
// --> result = WRONG
// should be: B[X] forSome {type X <: B[X]} -- can this be done automatically? for now, just detect f-bounded polymorphism and fall back to more coarse approximation
val data: List[A] = List(new C, new D)
val data2 = List(new C, new D)
val data3: List[B[X] forSome { type X <: B[_ <: A] }] = List(new C, new D)
// Not yet --
// val data4: List[B[X] forSome { type X <: B[X] }] = List(new C, new D)
// <console>:7: error: type mismatch;
// found : List[B[_ >: D with C <: B[_ >: D with C <: A]]]
// required: List[B[X] forSome { type X <: B[X] }]
// val data4: List[B[X] forSome { type X <: B[X] }] = List(new C, new D)
// works
val data5 = List[B[X] forSome { type X <: B[X] }](new C, new D)
}
|