@Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();

        if (lowerBounds.length > 0) {
            final Type lowerBound = lowerBounds[0];

            if (lowerBound instanceof Class<?>) {
                sb.append("? super ").append(((Class<?>) lowerBound).getName());
            }

            else {
                sb.append("? super ").append(lowerBound.toString());
            }
        }

        else if (upperBounds.length > 0) {
            final Type upperBound = upperBounds[0];

            if (upperBound.equals(Object.class)) {
                sb.append("?");
            }

            else if (upperBound instanceof Class<?>) {
                sb.append("? extends ").append(((Class<?>) upperBound).getName());
            }

            else {
                sb.append("? extends ").append(upperBound.toString());
            }
        }

        return sb.toString();
    }