The type parameter definitely participate in type checking; otherwise it will be pointless (i.e. no better than raw types).
The information is also needed to generate implicit casts so it will survive to your step 7 and technically to runtime as debug symbols. However, only the erasure will participate in runtime type cast checking (for obvious backwards compatibility reasons). Nonetheless, if your generic code can be fully statically checked, it can be as strong as generic programs in non-type-erasure languages.
When you assign SomeClass
to SomeClass<String>
, the compiler will give you a warning about raw type use. At this point, your program is obviously no longer safe.