Criando referências genéricas circulares
Estou escrevendo um aplicativo para fazer alguns cálculos distribuídos em uma rede ponto a ponto. Ao definir a rede, tenho duas classes: P2PNetwork e P2PClient. Eu quero que eles sejam genéricos e as definições de:
P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>
P2PClient<T extends P2PNetwork<? extends T>>
com P2PClient definindo um método de setNetwork (rede T). O que espero descrever com este código é:
Uma rede P2PN é constituída de clientes de um determinado tipoUm P2PClient pode pertencer apenas a uma rede cujos clientes consistem no mesmo tipo que esse cliente (a referência circular)Isso parece correto para mim, mas se eu tentar criar uma versão não genérica, como
MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
e outras variantes, recebo inúmeros erros do compilador. Então, minhas perguntas são as seguintes:
É ainda possível uma referência circular genérica (nunca vi nada que a proibisse explicitamente)?A definição genérica acima é uma definição correta de um relacionamento circular?Se for válido, é a maneira "correta" de descrever esse relacionamento (ou seja, existe outra definição válida, que é estilisticamente preferida)?Como eu definiria corretamente uma instância não genérica de um cliente e servidor, dada a definição genérica apropriada?