java - Wie erstellen Sie eine Instanz des generischen Typ T
Ich Schreibe ein server wie unten
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();
}
}
}
Aber in der handleNewConnectionRequest(...)
Methode, ich kann nicht erstellen Sie eine Instanz von T, wie es eigentlich nicht eine Klasse. Auch ich kann nicht mit der Methode erwähnt hier, wie ich will, pass den socket
Instanz, so dass der request-handler bekommen kann OutputStream
und InputStream
auf die socket
.
Kann ich nicht machen, eine generische server wie oben beschrieben und haben unterschiedliche Protokoll-Handler e.g
public class HttpRequestHandler extends RequestHandler {
...
}
public class FtpRequestHandler extends RequestHandler {
...
}
public class SmtpRequestHandler extends RequestHandler {
...
}
und verwenden Sie Sie dann wie unten
Server<HttpRequestHandler> httpServer = new Server<HttpRequestHandler>();
Server<FtpRequestHandler> ftpServer = new Server<FtpRequestHandler >();
Server<SmtpRequestHandler> smtpServer = new Server<SmtpRequestHandler >();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht machen anders
Server
Unterklassen standesgemäß verschiedene handler-Typen. Ein Beispiel:Anzupassen und Server, etwa so:
Nur so ein Gedanke...
Müssen Sie eine Instanz der Klasse. Der generische Typ T ist nicht genug. So werden Sie tun:
Nicht. Es macht keinen Sinn. In diesem Fall würde ich wohl vermeiden Generika. Plain old-interface oder abstrakte Klasse job macht. Sie können Abstrakt server mit abstrakten factory-Methode.
Können Sie es nicht direkt wie das mit generics in Java. Sie können mithilfe von Reflektion, wenn Sie das eigentliche Objekt der Klasse RequestHandler mit
getClass()
. Sie könnten versuchen, speichern Sie die Klasse des Objekts im Konstruktor und dann schreiben helper-Methode wie diese: