code: public static IType findParameterizedType_Reverse( IType sourceType, IType targetType )
    {
      if( sourceType == null || targetType == null )
      {
        return null;
      }
  
      if( !sourceType.isParameterizedType() )
      {
        return null;
      }
  
      // List<Z>
      IType sourceTypeInHier = findParameterizedType( targetType, getPureGenericType( sourceType ) );
  
      if( sourceTypeInHier == null || !sourceTypeInHier.isParameterizedType() )
      {
        return null;
      }
  
      TypeVarToTypeMap map = new TypeVarToTypeMap();
      IType[] params = sourceTypeInHier.getTypeParameters();
      for( int iPos = 0; iPos < params.length; iPos++  )
      {
        if( params[iPos] instanceof ITypeVariableType )
        {
          map.put( (ITypeVariableType)params[iPos], sourceType.getTypeParameters()[iPos] );
        }
      }
      // ArrayList<Foo>
      return getActualType( targetType, map, true );
    }
docs: ArrayList<Foo>                       List<Foo>         ArrayList<Z>