code: @SuppressWarnings("unchecked")
      @Override
      public void addStreamListener(final StreamListener<? extends Packet> listener) {
  
          try {
              final Method method = listener.getClass().getMethod("endStream", Stream.class);
              final ParameterizedType parameterizedType = (ParameterizedType) method.getGenericParameterTypes()[0];
              final Type[] parameterArgTypes = parameterizedType.getActualTypeArguments();
  
              // TODO: could actually be more.
              final Type parameterArgType = parameterArgTypes[0];
              final Class<?> parameterArgClass = (Class<?>) parameterArgType;
              if (parameterArgClass.equals(SipPacket.class)) {
                  if (this.sipStreamHandler == null) {
                      this.sipStreamHandler = new SipStreamHandler(this.framerManager);
                  }
                  this.sipStreamHandler.addListener((StreamListener<SipPacket>) listener);
              } else if (parameterArgClass.equals(RtpPacket.class)) {
                  if (this.rtpStreamHandler == null) {
                      this.rtpStreamHandler = new RtpStreamHandler(this.framerManager);
                  }
                  this.rtpStreamHandler.addListener((StreamListener<RtpPacket>) listener);
              }
  
          } catch (final ArrayIndexOutOfBoundsException e) {
              throw new RuntimeException("Unable to figure out the paramterized type", e);
          } catch (final SecurityException e) {
              throw new RuntimeException("Unable to access method information due to security constraints", e);
          } catch (final NoSuchMethodException e) {
              throw new RuntimeException("The startStream method doesn't exist. Signature changed?", e);
          } catch (final ClassCastException e) {
              // means that the user had not parameterized the StreamListener
              // interface, which means that we cannot actually detect streams.
              throw new IllegalArgumentException("The supplied listener has not been parameterized");
          }
      }
docs: To make life easier for the user we will figure out the type of
  {@link StreamListener} the user passed and based on that setup the
  correct stream analyzer etc.
  
  {@inheritDoc}