//
        // Exception audit:
        //
        //  Verdict
        //    No need to wrap thrown exceptions in a BCL class
        //
        //  Rationale
        //    `java.util.Collection.toArray()` is not documented to throw any exceptions.
        //
        public void CopyTo(Array array, int array_index)
        {
            if (array == null)
            {
                throw new ArgumentNullException("array");
            }
            if (array_index < 0)
            {
                throw new ArgumentOutOfRangeException("array_index");
            }
            if (array.Length < array_index + Count)
            {
                throw new ArgumentException("array");
            }

            if (id_toArray == IntPtr.Zero)
            {
                id_toArray = JNIEnv.GetMethodID(collection_class, "toArray", "()[Ljava/lang/Object;");
            }

            IntPtr lrefArray = JNIEnv.CallObjectMethod(Handle, id_toArray);

            for (int i = 0; i < Count; i++)
            {
                array.SetValue(
                    JavaConvert.FromJniHandle(
                        JNIEnv.GetObjectArrayElement(lrefArray, i),
                        JniHandleOwnership.TransferLocalRef,
                        array.GetType().GetElementType()),
                    array_index + i);
            }
            JNIEnv.DeleteLocalRef(lrefArray);
        }