DataLayer Interfaces Genericized
This answer will reflect the naming convention at my work. 

Naming Convention

Prefixing I to all your interface seems superfluous, since we use a simple name like ContractService. The implementation class would have Impl suffixed to the name of the service like : ContractServiceImpl. Normally you will use DI to inject the implementation where you need it, so you will only see the interface name.

Prefixing I seems odd to me if I'm looking at the Java collections API where you have : List, Map, etc. 

If you only use ContractService as the name of the implementation, it could not be clear at first read that you are using an implementation directly and not the interface. Using Impl as a suffix make it clear that it's the implementation, so if you see it in your code, it can show that something smelly is going on.

Naming of methods


public interface IProductService extends IListService&lt;Product&gt; {
    public List&lt;Product&gt; getAllCurrentProducts();
    public List&lt;Product&gt; getAllArchivedProducts();
}



Those methods are very good! If you can keep clear names like those, using your services will be easy. I like the way you named all you method!

Delete


public void delete(long id);



You could return the object that has been deleted. It could be useful if you want to show the information of the item that has been deleted. The client could decide if he wants to use the object or not.

Edit: In fact, you should not return an object since you're just working with long id and not the object directly. If the signature was public void delete(T delete) this would have been a good advice, but with the current signature, you would have a to retrieve the object, delete it and then return the deleted object.