@@ -3,9 +3,7 @@ package org.lunatech.dotty.opaquetypes
3
3
object Scala2TypeAliases :
4
4
type Kilometres = Double
5
5
class Rocket (distanceTravelled : Kilometres ):
6
- def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (
7
- distanceTravelled + distanceToAdvance
8
- )
6
+ def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (distanceTravelled + distanceToAdvance)
9
7
10
8
type Miles = Double
11
9
class Booster ():
@@ -18,19 +16,18 @@ object Scala2ClassWrappers:
18
16
case class Kilometres (value : Double )
19
17
class Rocket (distanceTravelled : Kilometres ):
20
18
def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (
21
- Kilometres (distanceTravelled.value + distanceToAdvance.value)
22
- )
19
+ Kilometres (distanceTravelled.value + distanceToAdvance.value))
23
20
24
21
case class Miles (value : Double )
25
22
class Booster () {
23
+
26
24
/** COMMENTED OUT. DOES NOT COMPILE. */
27
25
28
26
// def advanceRocket(rocket: Rocket, distanceToAdvance: Miles): Rocket = {
29
27
// // Kilometres and Miles are different types. So compiler prevents this bug
30
28
// rocket.advance(distanceToAdvance)
31
29
// }
32
30
33
-
34
31
}
35
32
end Scala2ClassWrappers
36
33
@@ -137,7 +134,7 @@ object Scala3OpaqueTypeAliasesDefinitions:
137
134
def toMiles : Miles = a / 1.6
138
135
139
136
extension (a : Miles )
140
- @ targetName(" plusMiles" )
137
+ @ targetName(" plusMiles" )
141
138
def + (b : Miles ): Miles = a + b
142
139
143
140
def toKm : Kilometres = a * 1.6
@@ -148,9 +145,7 @@ object Scala3OpaqueTypeAliasesTypeSafety:
148
145
import Scala3OpaqueTypeAliasesDefinitions ._
149
146
150
147
class Rocket (distanceTravelled : Kilometres ):
151
- def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (
152
- distanceTravelled + distanceToAdvance
153
- )
148
+ def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (distanceTravelled + distanceToAdvance)
154
149
155
150
class Booster ():
156
151
def advanceRocket (rocket : Rocket , distanceToAdvance : Kilometres ): Rocket = {
@@ -169,17 +164,15 @@ object Scala3OpaqueTypeAliasesNoAllocations1:
169
164
export Scala3OpaqueTypeAliasesDefinitions ._
170
165
171
166
class Rocket (val distanceTravelled : Kilometres ):
172
- def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (
173
- distanceTravelled + distanceToAdvance
174
- )
167
+ def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (distanceTravelled + distanceToAdvance)
175
168
176
169
type Distance = Kilometres | Miles
177
170
class Booster ():
178
171
// THIS GIVES A WARNING. THE 'Kilometres' CASE IS UNREACHABLE due to erasure.
179
172
// SO WE HAVE A BUG. Any 'Kilometres' passed to this method will be multiplied by 1.6
180
173
def advanceRocket (rocket : Rocket , distanceToAdvance : Distance ): Rocket = {
181
174
val distanceInKm = distanceToAdvance match {
182
- case miles : Miles => miles.toKm
175
+ case miles : Miles => miles.toKm
183
176
case km : Kilometres => km
184
177
}
185
178
rocket.advance(distanceInKm)
@@ -202,9 +195,7 @@ object Scala3OpaqueTypeAliasesNoAllocations2:
202
195
import Scala3OpaqueTypeAliasesDefinitions ._
203
196
204
197
class Rocket (val distanceTravelled : Kilometres ) {
205
- def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (
206
- distanceTravelled + distanceToAdvance
207
- )
198
+ def advance (distanceToAdvance : Kilometres ): Rocket = new Rocket (distanceTravelled + distanceToAdvance)
208
199
}
209
200
210
201
type Conversion [A ] = A => Kilometres
@@ -239,6 +230,6 @@ object Scala3OpaqueTypeAliasesNoAllocations3:
239
230
* public static double[] distances() {
240
231
* return Scala3OpaqueTypeAliasesNoAllocations3$.MODULE$.distances();
241
232
* }
242
- *
233
+ *
243
234
*/
244
235
val distances : Array [Kilometres ] = Array (Kilometres (10 )) // No allocation of Kilometres object
0 commit comments