object Foos {
opaque type Foo = Int
// type Foo = Int ;//does not work too
final val A:Foo = 1
final val B:Foo = 2
final val C:Foo = 3
final val D:Foo =4
}
import Foos.Foo
def test(x: Foo): Int = (x: @scala.annotation.switch) match {
case Foos.A => 1
case Foos.B => 2
case Foos.C => 3
case Foos.D => 4
}
which gives me Could not emit switch for @switch annotated match
Seems it can’t be a table switch ?
1 Like
If you add a type ascription Foo
to A
, then the compiler loses the information that it’s 1
. It’s not necessarily because of the opaque type; you get the same issue if you use Int
everywhere. It’s just that the opaque type makes the problem unavoidable if you want to hide the relationship between Foo
and Int
completely. Only if the opaque type is transparent can you make it work.
2 Likes
Thanks but the problem is when once I remove the :Foo
then I can’t pass it to where a Foo
is needed.
Required: ~~ndition.optimizer.CompOps.CompOp
~~ substitute/GroupingVarSubstitution.scala:66:14: Found: (~~ondition.optimizer.CompOps.In : (7 : Int))