Я пишу приложение для выполнения некоторых распределенных вычислений в одноранговой сети. При определении сети у меня есть два класса P2PNetwork и P2PClient. Я хочу, чтобы они были универсальными, и поэтому имеют следующие определения:
P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>
P2PClient<T extends P2PNetwork<? extends T>>
с P2PClient, определяющим метод setNetwork (сеть T). Я надеюсь, что этот код будет описан следующим образом:
- P2PNetwork состоит из клиенты определенного типа.
- P2PClient может принадлежать только сеть, клиенты которой состоят из тот же тип, что и этот клиент ( круговая ссылка)
Это кажется правильным для меня, но если я попытаюсь создать не-общую версию, например
MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
и другие варианты. Я получаю многочисленные ошибки от компилятора. Поэтому мои вопросы таковы:
- Является ли общая круговая ссылка ровной возможно (я никогда не видел ничего явно запрещающего его)?
- Является ли приведенное выше общее определение a правильное определение такого кругового отношения?
- Если это действительно так, то это "правильный" способ описания таких отношений (т.е. существует еще один действительный определение, которое является стилистическим предпочтительным)?
- Как правильно определить не общий экземпляр Клиента и Сервер, получивший правильный общий определение?