@Override
        public String toString() {
            StringBuilder buffer = new StringBuilder(128);
            buffer.append(this.getGenericComponentType()).append("[]");
            return buffer.toString();
        }
    }

    public static class ParameterizedTypeImpl
        implements java.lang.reflect.ParameterizedType {

        private java.lang.reflect.Type rawType;
        private java.lang.reflect.Type ownerType;
        private java.lang.reflect.Type[] typeArguments;

        public ParameterizedTypeImpl(java.lang.reflect.Type rawType,
                                     java.lang.reflect.Type[] typeArguments) {
            this.rawType = rawType;
            this.typeArguments = typeArguments;
        }

        public ParameterizedTypeImpl(java.lang.reflect.Type ownerType,
                                     java.lang.reflect.Type rawType,
                                     java.lang.reflect.Type[] typeArguments) {
            this.rawType = rawType;
            this.ownerType = ownerType;
            this.typeArguments = typeArguments;
        }

        @Override
        public java.lang.reflect.Type getOwnerType() {
            return this.ownerType;
        }

        @Override
        public java.lang.reflect.Type getRawType() {
            return this.rawType;
        }

        @Override
        public java.lang.reflect.Type[] getActualTypeArguments() {
            return this.typeArguments;
        }

        @Override
        public int hashCode() {
            int hash = 17;
            hash += (19 * this.rawType.hashCode());
            for (java.lang.reflect.Type argument : this.typeArguments) {
                hash += (23 * argument.hashCode());
            }

            return hash;
        }

        @Override
        public boolean equals(Object object) {
            if (object == this) { return true; }
            else if (!(object instanceof java.lang.reflect.ParameterizedType)) {
                return false;
            }

            java.lang.reflect.ParameterizedType other =
                (java.lang.reflect.ParameterizedType) object;
            if (!this.getRawType().equals(other.getRawType())) { return false; }

            java.lang.reflect.Type[] thisArguments =
                this.getActualTypeArguments();
            java.lang.reflect.Type[] otherArguments =
                other.getActualTypeArguments();

            if (thisArguments.length != otherArguments.length) { return false; }

            for (int i = 0; i < thisArguments.length; i++) {
                if (!thisArguments[i].equals(otherArguments[i])) { return false; }
            }

            return true;
        }

        @Override
        public String toString() {
            StringBuilder buffer = new StringBuilder(128);
            buffer.append(this.getRawType()).append('<');

            boolean first = true;
            for (java.lang.reflect.Type argument : this.getActualTypeArguments()) {
                if (!first) { buffer.append(','); }

                first = false;
                buffer.append(argument);
            }

            buffer.append('>');
            return buffer.toString();
        }