Estoy escribiendo un servidor, como a continuaciónJava - Cómo crear una instancia de tipo genérico T
public class Server<T extends RequestHandler> {
public void start() {
try{
this.serverSocket = new ServerSocket(this.port, this.backLog);
} catch (IOException e) {
LOGGER.error("Could not listen on port " + this.port, e);
System.exit(-1);
}
while (!stopTheServer) {
socket = null;
try {
socket = serverSocket.accept();
handleNewConnectionRequest(socket);
} catch (IOException e) {
LOGGER.warn("Accept failed at: " + this.port, e);
e.printStackTrace();
}
}
}
protected void handleNewConnectionRequest(Socket socket) {
try {
executorService.submit(new T(socket));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Pero en el método handleNewConnectionRequest(...)
, no puede crear una instancia de T, ya que no es en realidad una clase . Tampoco puedo utilizar el método mencionado here porque quiero pasar la instancia socket
para que el controlador de solicitud pueda obtener OutputStream
y InputStream
en el socket
.
no puedo hacer un servidor genérico como anteriormente y tienen diferentes controladores de protocolo, por ejemplo,
public class HttpRequestHandler extends RequestHandler {
...
}
public class FtpRequestHandler extends RequestHandler {
...
}
public class SmtpRequestHandler extends RequestHandler {
...
}
y luego usarlos como a continuación
Server<HttpRequestHandler> httpServer = new Server<HttpRequestHandler>();
Server<FtpRequestHandler> ftpServer = new Server<FtpRequestHandler >();
Server<SmtpRequestHandler> smtpServer = new Server<SmtpRequestHandler >();
+1. O haga que el servidor use RequestHandlerFactory y solicite a esta fábrica que cree un RequestHandler cada vez que el servidor lo necesite. –
@JBNizet ¡Oye, aún mejor! He encontrado clases/implementaciones abstractas y parámetros de tipo para ser realmente buenos amigos para el diseño OO. –