blob: bc906f4f4e701d40aebb0bcf7905a4a64a8dde6a (
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
trait A { type L <: Nothing }
trait B { type L >: Any}
object Test {
lazy val x: A & B = ???
val y: x.L = 1 // error: underlying conflicting bounds
val z: String = y
}
object Test50 {
trait A {
type X = String
}
trait B {
type X = Int
}
lazy val o: A & B = ???
def xToString(x: o.X): String = x // error: underlying conflicting bounds
def intToString(i: Int): String = xToString(i)
def main(args: Array[String]) = {
val s: String = intToString(1)
}
}
object Test2 {
trait C { type A }
type T = C { type A = Any }
type U = C { type A = Nothing }
type X = T & U
def main(args: Array[String]) = {
val y: X#A = 1 // error: conflicting bounds
val z: String = y
}
}
object Tiark1 {
trait A { type L <: Nothing }
trait B { type L >: Any}
trait U {
val p: B
def brand(x: Any): p.L = x // error: not final
}
trait V extends U {
lazy val p: A & B = ???
}
val v = new V {}
v.brand("boom!")
}
object Tiark2 {
trait A { type L <: Nothing }
trait B { type L >: Any}
trait U {
type X <: B
val p: X
def brand(x: Any): p.L = x // error: not final
}
trait V extends U {
type X = B & A
lazy val p: X = ???
}
val v = new V {}
v.brand("boom!"): Nothing
}
/*
object Import {
trait A { type L <: Nothing }
trait B { type L >: Any}
trait U {
val p: B
def brand(x: Any): p.L = x // error: not final
locally { import p._
}
}
trait V extends U {
lazy val p: A & B = ???
}
val v = new V {}
v.brand("boom!")
}
*/
|