public static void CheckListenerMethodsFromJavaWorld()
        {
            var javaListener   = new ListenerImplementor();
            var csharpListener = new ListenerCSharpImplemntor();
            var javaInvoker    = new ListenerInvoker();

            // This should work fine
            WrapCall(
                javaInvoker,
                javaListener,
                nameof(javaInvoker.InvokeListenerImplementorMethod),
                () => javaInvoker.InvokeListenerImplementorMethod(javaListener));

            // This should work fine
            WrapCall(
                javaInvoker,
                javaListener,
                nameof(javaInvoker.InvokeListenerImplementorMethod),
                () => javaInvoker.InvokeListenerMethod(javaListener));

            // This throws AbstractMethodError when it shouldn't
            WrapCall(
                javaInvoker,
                csharpListener,
                nameof(javaInvoker.InvokeListenerImplementorMethod),
                () => javaInvoker.InvokeListenerMethod(csharpListener));
        }
        public static void CheckListenerMethodsFromCSharpWorld()
        {
            var javaListener   = new ListenerImplementor() as IListener;
            var csharpListener = new ListenerCSharpImplemntor()  as IListener;

            // This should work fine
            WrapCall(
                javaListener,
                false,
                nameof(javaListener.OnValueChanged),
                () => javaListener.OnValueChanged(false));

            // This throws AbstractMethodError when it shouldn't
            WrapCall(
                csharpListener,
                false,
                nameof(csharpListener.OnValueChanged),
                () => csharpListener.OnValueChanged(false));
        }