java - 如何创建泛型类型T的实例

Yat*_*oel 9 java generics

我正在编写如下的服务器

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在handleNewConnectionRequest(...)方法中,我无法创建T的实例,因为它实际上不是类.此外,我不能用上述的方法在这里,我想通过socket实例,以便请求处理程序可以得到OutputStreamInputStreamsocket.


我不能像上面那样制作通用服务器,并且有不同的协议处理程序,例如

public class HttpRequestHandler extends RequestHandler {
    ...
}

public class FtpRequestHandler extends RequestHandler {
    ...
}

public class SmtpRequestHandler extends RequestHandler {
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后像下面一样使用它们

Server<HttpRequestHandler> httpServer = new Server<HttpRequestHandler>();
Server<FtpRequestHandler> ftpServer = new Server<FtpRequestHandler >();
Server<SmtpRequestHandler> smtpServer = new Server<SmtpRequestHandler >();
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 9

你需要一个类的实例.通用类型T是不够的.所以你会这样做:

class Server <T extends RequestHandler> {
    Class<T> clazz;
    public Server(Class<T> clazz) {
        this.clazz = clazz;
    }

    private T newRequest() {
        return clazz.newInstance();
    }
}
Run Code Online (Sandbox Code Playgroud)


G_H*_*G_H 5

也许使不同的Server子类适合各种处理程序类型.一个例子:

public class HttpServer extends Server<HttpRequestHandler> {

    protected HttpRequestHandler wrapSocket(Socket socket) {
        return new HttpRequestHandler(socket);
    }

}
Run Code Online (Sandbox Code Playgroud)

并像这样适应服务器:

public abstract class Server<T extends RequestHandler> {

    protected abstract T wrapSocket(Socket socket);

    protected void handleNewConnectionRequest(Socket socket) {
        try {
            executorService.submit(wrapSocket(socket));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

只是一个想法...

  • +1.或者让服务器使用RequestHandlerFactory <T>并要求此工厂在每次服务器需要时创建一个RequestHandler <T>. (2认同)