private static int moreSpecific( Class<?>[] c1, Class<?>[] c2 )
    {
        boolean c1MoreSpecific = false;
        boolean c2MoreSpecific = false;

        for ( int i = 0; i < c1.length; ++i )
        {
            if ( c1[i] != c2[i] )
            {
                c1MoreSpecific = c1MoreSpecific || isStrictMethodInvocationConvertible( c2[i], c1[i] );
                c2MoreSpecific = c2MoreSpecific || isStrictMethodInvocationConvertible( c1[i], c2[i] );
            }
        }

        if ( c1MoreSpecific )
        {
            if ( c2MoreSpecific )
            {
                /*
                 *  Incomparable due to cross-assignable arguments (i.e.
                 * foo(String, Object) vs. foo(Object, String))
                 */

                return INCOMPARABLE;
            }

            return MORE_SPECIFIC;
        }

        if ( c2MoreSpecific )
        {
            return LESS_SPECIFIC;
        }

        /*
         * Incomparable due to non-related arguments (i.e.
         * foo(Runnable) vs. foo(Serializable))
         */

        return INCOMPARABLE;
    }