code: protected Channel createChannel(ChannelData channelData) throws ChannelException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "createChannel");
          }
  
          TCPChannelConfiguration newCC = new TCPChannelConfiguration(channelData);
          TCPChannel channel = null;
  
          boolean isOverrideClassUsed = false;
          if ((!newCC.isNIOOnly())
              && (commClass != null)
              && (ChannelFrameworkImpl.getRef().getAsyncIOEnabled())) {
              try {
                  channel = (TCPChannel) commClass.newInstance();
                  ChannelTermination ct = channel.setup(channelData, newCC, this);
                  if (ct != null) {
                      this.terminationList.put(commClassName, ct);
                  }
                  isOverrideClassUsed = true;
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "using CommClass: " + commClass);
                  }
              } catch (Exception e) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Exception trying to instantiate CommClass: " + e);
                  }
              }
          }
  
          if (!isOverrideClassUsed) {
              channel = new NioTCPChannel();
              ChannelTermination ct = channel.setup(channelData, newCC, this);
              if (ct != null) {
                  this.terminationList.put("NioTCPChannel", ct);
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "createChannel");
          }
          return channel;
      }
docs: Declared abstract in the ChannelFactoryImpl class.
  
  @param channelData
  @return Channel
  @throws ChannelException