我寫類似下面爪哇 - 如何,因爲它實際上不是一個類來創建泛型類型的牛逼
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();
}
}
}
但在handleNewConnectionRequest(...)
方法,我不能創建T的實例的服務器。此外,我不能使用方法here,因爲我想通過socket
實例,以便請求處理程序可以在socket
上獲得OutputStream
和InputStream
。
我不能做一個普通的服務器上面的一樣,有不同的協議處理程序,例如
public class HttpRequestHandler extends RequestHandler {
...
}
public class FtpRequestHandler extends RequestHandler {
...
}
public class SmtpRequestHandler extends RequestHandler {
...
}
,然後用它們像下面
Server<HttpRequestHandler> httpServer = new Server<HttpRequestHandler>();
Server<FtpRequestHandler> ftpServer = new Server<FtpRequestHandler >();
Server<SmtpRequestHandler> smtpServer = new Server<SmtpRequestHandler >();
+1。或者讓服務器使用RequestHandlerFactory,並要求該工廠在每次服務器需要時創建一個RequestHandler 。 –
@JBNizet嘿,更好!我發現抽象類/實現和類型參數是面向對象設計的真正好朋友。 –