Bad:
- Type information is lost at compile time, so at execution time you can’t tell what type it’s “meant” to be
- Can’t be used for value types (this is a biggie – in .NET a
List<byte>
really is backed by abyte[]
for example, and no boxing is required) - Syntax for calling generic methods sucks (IMO)
- Syntax for constraints can get confusing
- Wildcarding is generally confusing
- Various restrictions due to the above – casting etc
Good:
- Wildcarding allows covariance/contravariance to be specified at calling side, which is very neat in many situations
- It’s better than nothing!