code: public boolean isAssignableFrom( IType type )
    {
      if( type == this )
      {
        return true;
      }
  
      if( type instanceof ICompoundType )
      {
        for( IType t: ((ICompoundType)type).getTypes() )
        {
          if( isAssignableFrom( t ) )
          {
            return true;
          }
        }
        return false;
      }
  
      if( !(type instanceof TypeVariableType) )
      {
        return false;
      }
  
      if( !getRelativeName().equals( type.getRelativeName() ) )
      {
        return false;
      }
  
      IType thatEncType = type.getEnclosingType();
      IType thisEncType = getEnclosingType();
      return thatEncType == thisEncType ||
             functionTypesEqual( thisEncType, thatEncType ) ||
             thatEncType instanceof IGosuClassInternal &&
             ((IGosuClassInternal)thatEncType).isProxy() &&
             thisEncType == ((IGosuClassInternal)thatEncType).getJavaType();
    }
docs: A type variable type is assignable only to/from itself or a reference thereof.
  <p>
  For example: <pre>
  function foo<T,S>( t: T, s: S )
  {
  t = s         // illegal, T and S may not have the same type at runtime
  t = "hello"   // illegal, T may not be a String
  var x: T = t  // ok, x and t are both of type T
  }