Comparable is used to define a natural order of a class, so that sort routines (such as Collections.sort()) are able to sort them. To be able to sort objects, you have to have a way of defining what order they should come in - we can do this by implementing Comparable.
The generic constraint you see there is really a bit different to implementation. The word extends is used regardless of whether you're referring to a class or an interface, because in this context it's not really important. And also, E could refer to an interface, and interfaces extend other interfaces.
I’ve looked at a lot of different solutions, and in my humble opinion Aspose is the way to go. Here’s the link: http://aspose.com