Я думаю, что решил это ...
Основная ошибка в моем вопросе состояла в том, что я хотел определить элементы строки в контейнере.Теперь я определяю в строке, какому заголовку он принадлежит.
interface Line<R> {}
Затем я определяю LineContainer, который обслуживает строки из определенного типа
interface LineContainer<H, L extends Line<H>> {
public List<L> getLines();
}
Теперь я могу определить универсальный сервисМетод (выглядит немного иначе, чем мой подход выше):
public static <H,L extends Line<H>,C extends LineContainer<H,L>> C getContainer( Class<C> containerType, Class<L> lineType ){
// ...something...
}
Определение страны и округа следующим образом:
interface County extends Line<Country>{}
interface Country extends LineContainer<Country,County>{};
Теперь я могу использовать без проблем:
LineContainer<Country,County> container = getContainer( Country.class, County.class );
Другой пример с LineContainer и Line:
interface Note extends Line<Gamut>{}
interface Gamut extends LineContainer<Gamut,Note>{};
LineContainer<Gamut,Note> container = getContainer( Gamut.class, Note.class );
Метод службы должен проверить, могут ли обслуживаться требуемые типы, но пользователь службы не может объединять типы, которые не совместимы:
НЕ РАЗРЕШЕНО
LineContainer<Gamut,County> container = getContainer( Gamut.class, County.class );
, поскольку округ не является "линией" гаммы ...