Clases de genéricos con dependencia reflexiva

Esto es algo con lo que me encontré tratando de resolver la pregunta de otra persona aquí, en una versión simplificada. El cliente y el servidor con dependencia reflexiva (circular) usan genéricos para tratar de mantener referencias fuertemente tipadas en superclase. El deseo era para emparejamientos de subtipos arbitrarios, como ClientType1 <-> ServerType2, y para llamadas fuertemente tipadas en métodos especializados que se encuentran solo en un tipo específico.

Esto solo funciona para un nivel de profundidad: del servidor al cliente, pero falla si luego intentas continuar desde ese cliente de regreso al servidor: ¿Hay alguna sintaxis que permita niveles arbitrarios de llamadas fuertemente tipadas?

abstract class ServerBase<C extends ClientBase<?>>
{
    ArrayList<C> clients = new ArrayList<C>();
}
abstract class ClientBase<S extends ServerBase<?>>
{
    S server;
}
class ClientType1<S extends ServerBase<?>> extends ClientBase<S>
{
    public void clientType1Method() {}
}

class ServerType1<C extends ClientBase<?>> extends ServerBase<C>
{

}



public class Example {
     public static void main(String[] args) {
        ServerType1<ClientType1<?>> s = new ServerType1<>();
        s.clients.get(0).clientType1Method(); // Single depth level - OK
        s.clients.get(0).server.clients.get(0).clientType1Method(); // level 2 - compiler error - undefined method      
     }
}
Respuesta 1

En mi opinión, en realidad no debería necesitar una referencia tan intrincada.

Lo que realmente quiere decir es que el cliente debe tener una referencia a un servidor al que pueda conectarse, y viceversa.

lo que debería funcionar es:

abstract class ServerBase<C extends ClientBase<? extends ServerBase>>
{
    ArrayList<C> clients = new ArrayList<C>();
}
abstract class ClientBase<S extends ServerBase<? extends ClientBase>>
{
    S server;
}
Respuesta: 2

Si haces un pequeño ajuste con este código, seguramente funcionará.

abstract class ClientBase<S extends ServerBase<?>> {
    S server;

    public abstract void clientMethod();
}

.......

public static void main(String[] args) {
    ServerType1<ClientBase<?>> s = new ServerType1<>();
    s.clients.get(0).clientMethod(); // Single depth level - OK

    s.clients.get(0).server.clients.get(0).clientMethod(); 
    // second  level - NO compiler error
}
Respuesta: 3

¿Cómo puedo eliminar elementos negativos de una matriz sin hacer una copia de ella? / Mover la posición de la matriz. Digamos, por ejemplo, si el usuario llenó la matriz, ¿qué método podría usar para simplemente devolver ...

En todos los tutoriales que he leído siempre dicen que coincide con un espacio en blanco. Entonces, ¿por qué esta instrucción System.out.println ("line1 \ n line2" .replaceAll ("\\ s \\ s *", "")); tener esta salida: ...

Estoy tratando de deshabilitar cifrar y descifrar puntos finales en el servidor de configuración de Spring Cloud. Mi archivo Bootstrap.yml es spring: cloud: config: server: encrypt: enabled: false ...

Considere el siguiente texto que forma parte de un archivo Name & Emp No Jack Doe 1234 John 12345 Dob: 28/12/1987 Ahora me gustaría escribir una sola expresión regular (sabor java) para extraer solo el ...