Read Tim Bray's adventures with generics in Java - and you'll know why a system that forces you to make the compiler happy does so at the cost of your productivity. The justification for all that complexity?
At the end of the day, my interfaces are all nicely parameterized and their customers won’t be getting any warnings. And I do think that making Comparable a little less of a blunt instrument was probably a good idea; after all, even if Fish is a Comparable, the following is probably unsound:
if ((new Fish(freshwater)).compareTo(new Bicycle(racing)) < 0)
The actual liklihood of that line of code being written? Approximately zero, and even then, only for your larger values of zero. But Java is good that way, protecting you from events you'll never see, and making sure you'll rationalize them away.
Meanwhile, we're busy being productive over here.