On a second thought, lub does lose important information, because `if (x) Array[C]() else Array[D]()` (given that `C <: D`) and `if (x) Array[C]() else Array[Nothing]()` should be erased differently, therefore we indeed cannot abstract away from implementation details here.

As to the "making it work" part wrt the erasure-based approach, it would be truly interesting to hear about your experience why it didn't work out. Did it require shotgun surgery, or there was another kind of a problem?