Re: .NET .. the lame clone of Java
you can't determine the type of a generic at run time.
But is it a real problem? Apparently not. Indeed, it is a solution to a problem:
"It's funny when Java users complain about type erasure, which is the only thing Java got right, while ignoring all the things it got wrong."
Erasing means we've reasoned (so let's erase)
So if we want to reason about our programs, we're strongly advised to not employ language features that strongly threaten our reasoning [i.e. runtime-usable parametrized type information, or indeed any type information]. Once we do that, then why not just drop the types at runtime? They're not needed. We can get some efficiency and simplicity with the satisfaction that no casts will fail or that methods might be missing upon invocation. Erasing encourages reasoning.
Of course, you may want to go crazy-hog self-modifying (which I like to do, too), in which case you do want runtime information and maybe inject a method or two into a class because you feel like it or want to process freshly obtained WSDL in a particularly elegant way , but then compile-time checks are useless, which may be unacceptable depending on the application.
OTOH, if clear reasoning and proving of code is demanded, I would strongly suggest to look into functional languages as well as logic programming languages. Things are pretty good on that front.