It is a challenge to let all the type information evaporate and then be able to reconstruct it post-erasure - keeping in mind you may have something with a type of say "Array[Int]" which erased to "AnyRef" and which stands to hold not only an actual Array[Int] but an Array[Object] thanks to Array[Nothing]. The last straw was when I was sneaking in an overload to this Predef implicit:
```
  implicit def refArrayOps[T <: AnyRef](xs: Array[T]): ArrayOps[T]    = new ArrayOps.ofRef[T](xs)
```
a non-implicit AnyRef overload, so I could generate calls and let it sort out what sort of Array it was. Except you can't actually overload a method with Array[T] and AnyRef, because Array[T] erases to AnyRef. Hoisted by the very petard I was trying to don, or something. Not that it had to be an overload, it was the principle of the thing.