Source:
<code>public static CompletionStage<RawMemcacheClient> connect( final HostAndPort address, final int outstandingRequestLimit, final boolean binary, final Executor executor, final long timeoutMillis, final Charset charset, final Metrics metrics, final int maxSetLength, final EventLoopGroup eventLoopGroup, final Class<? extends Channel> channelClass) { final ChannelInboundHandler decoder; if (binary) { decoder = new BinaryMemcacheDecoder(); } else { decoder = new AsciiMemcacheDecoder(charset); } <START> final ChannelHandler initializer = new ChannelInitializer() { <END> @Override protected void initChannel(final Channel ch) throws Exception { ch.pipeline().addLast( new TcpTuningHandler(), decoder, new MemcacheEncoder() ); } }; final CompletableFuture<RawMemcacheClient> clientFuture = new CompletableFuture<>(); EventLoopGroup effectiveELG = eventLoopGroup != null ? eventLoopGroup : defaultEventLoopGroup(); Class<? extends Channel> effectiveChannelClass = channelClass != null ? channelClass : defaultChannelClass(effectiveELG); final Bootstrap bootstrap = new Bootstrap() .group(effectiveELG) .handler(initializer) .channel(effectiveChannelClass) .option(ChannelOption.MESSAGE_SIZE_ESTIMATOR, SimpleSizeEstimator.INSTANCE); final ChannelFuture connectFuture = bootstrap.connect( new InetSocketAddress(address.getHostText(), address.getPort())); connectFuture.addListener((ChannelFutureListener) future -> { if (future.isSuccess()) { final RawMemcacheClient client = new DefaultRawMemcacheClient( address, future.channel(), outstandingRequestLimit, executor, timeoutMillis, metrics, maxSetLength); clientFuture.complete(client); } else { future.channel().close(); clientFuture.completeExceptionally(future.cause()); } }); return onExecutor(clientFuture, executor); }</code><technical_language>I looked netty upgrade change - is ChannelInitializer longer a generic class</technical_language>

Target:
public static CompletionStage<RawMemcacheClient> connect( final HostAndPort address, final int outstandingRequestLimit, final boolean binary, final Executor executor, final long timeoutMillis, final Charset charset, final Metrics metrics, final int maxSetLength, final EventLoopGroup eventLoopGroup, final Class<? extends Channel> channelClass) { final ChannelInboundHandler decoder; if (binary) { decoder = new BinaryMemcacheDecoder(); } else { decoder = new AsciiMemcacheDecoder(charset); } final ChannelHandler initializer = new ChannelInitializer<Channel>() { @Override protected void initChannel(final Channel ch) throws Exception { ch.pipeline().addLast( new TcpTuningHandler(), decoder, new MemcacheEncoder() ); } }; final CompletableFuture<RawMemcacheClient> clientFuture = new CompletableFuture<>(); EventLoopGroup effectiveELG = eventLoopGroup != null ? eventLoopGroup : defaultEventLoopGroup(); Class<? extends Channel> effectiveChannelClass = channelClass != null ? channelClass : defaultChannelClass(effectiveELG); final Bootstrap bootstrap = new Bootstrap() .group(effectiveELG) .handler(initializer) .channel(effectiveChannelClass) .option(ChannelOption.MESSAGE_SIZE_ESTIMATOR, SimpleSizeEstimator.INSTANCE); final ChannelFuture connectFuture = bootstrap.connect( new InetSocketAddress(address.getHostText(), address.getPort())); connectFuture.addListener((ChannelFutureListener) future -> { if (future.isSuccess()) { final RawMemcacheClient client = new DefaultRawMemcacheClient( address, future.channel(), outstandingRequestLimit, executor, timeoutMillis, metrics, maxSetLength); clientFuture.complete(client); } else { future.channel().close(); clientFuture.completeExceptionally(future.cause()); } }); return onExecutor(clientFuture, executor); }