-
-
Save paulp/9081797 to your computer and use it in GitHub Desktop.
scala> val buf = ListBuffer(1) | |
buf: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1) | |
scala> val xs = buf.toIterable match { case xs: List[Int] => xs } | |
xs: List[Int] = List(1) | |
scala> buf ++= 1 to 100 | |
res11: buf.type = ListBuffer(1, 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, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100) | |
scala> xs | |
res12: List[Int] = List(1, 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, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100) |
Using asInstanceOf is the problem. I think it's just better to understand the relationship from an apparently unrelated unsafe function to the practical outcome.
Too few people make this connection in my experience.
@samskivert That assessment is incorrect in numerous ways. I'm amazed people want to make excuses for this. Typecase is built into scala, it is absolutely unavoidable - there's not even any separation between ADTs and matching against arbitrary types. Matching against collections types is completely standard. The "default lacking" is irrelevant, I can add a default and it's exactly the same. "case _ => Nil".
It isn't a question of what tricks I can play on myself, but of what guarantees the standard data structures are going to make. For an "immutable" class, the non-negotiable guarantee is that it be immutable, like this isn't.
@kman007us List is advertised as an "immutable" data structure, which means it won't suddenly go from having 1 element to having 101 elements.
Typecase is absolutely avoidable in Scala.
For some reason, no one complained about the ScalaDoc. After the dot.
You're basically doing
buf.toIterable.asInstanceOf[List[Int]]
dressed up in the dubious legitimacy of a default-lacking pattern match.Poo poo to Scala for providing this back door, but you can hardly complain about funny business when you're sneaking in through it.