type erasure scala compiler phase