Правила объявления интерфейсов. «I» или «!I»?
Никакой "официальной" жесткой конвенции на этот счет нет. Как уже указал RGV, какую конвенцию использовать - личное дело команды / фирмы / техдира.
Я сам в свое время пришел к Java из Pascal и .NET, и тоже придерживаюсь нотации с I, т.к. это позволяет в коде визуально отличить интерфейс от класса. Просто для примера:...
  IProducer simpleProducer = new Producer();
  IProducer sofisticatedProducer = new SpecialProducer();
...
  public void produceSomething(IProducer producer);
При взгляде на такой код сразу понятно, кто из ху, без всяких дополнительных кликов, наведения курсора и прочих пританцовываний с IDE.
И хотя это никак явно не помешает креативному балбесу влепить класс там, где нужно использовать интерфейс, это поможет проводящему ревью заметить грабли невооруженным глазом :)  С моей точки зрения цена такого удобства в 1 (один !) доп. символ в имени вполне оправдана.
Действительно для отличия интерфейса от класса. Так как классы зачастую называются подобным образом. 
List - IListПри вводе удобно. "I" + Ctrl + spaceЧитабельно. В том числе и просто контекстно соответствует в большинстве случаев. IHasGenerator - Я Имею Генератор