CollectorInterface по сути не является контрактом, потому как его значимый метод collect() неоднозначен и допускает несовместимые имплементации. Поэтому при текущей реализации нужно либо удалить этот метод из интерфейса либо целиком выбросить интерфейс, а вместо интерфеса указывать сами конкретные коллекторы. Собственно по этому интерфесу сечас и можно передать только конкретный коллектор. Например в LogProxy в конструкторе в CollectorInterface можно передать только LogCollector, а вот у же EventCollector там не подойдет, несмотря на то, что он реализует CollectorInterface.
Это создано по твоему запросу. Ты хотел сделать свои лог/эвент коллекторы. Если передавать туда не интерфейс, то своё уже не поставишь, т.к. классы финал