Well, the point of an interface is always the same. To define an abstract contract that allows for different implementations of said contract. For example for unit testing you can substitute the Cocktail implementation of the repository with a fake implementation that returns hard-coded data or you can easily replace an existing repository with an optimized implementation if you run into performance problems later in the lifecycle without having to change the parts of your application that interact with the repository. Interfaces are a pretty fundamental concept in modern programming languages.
If you don't like the contract that IRepository<T> provides, then you simply create your own interface that either extends IRepository<T> or completely replaces it.