@Override
    public boolean equals(Object other) {
        if (other == this) { return true; }
        else if (!(other instanceof WildcardTypeDesc)) { return false; }

        WildcardTypeDesc type = (WildcardTypeDesc) other;
        return ((this.lowerBounds == null && type.lowerBounds == null) ||
                (this.lowerBounds != null &&
                    this.lowerBounds.equals(type.lowerBounds))) &&
               ((this.upperBounds == null && type.upperBounds == null) ||
                (this.upperBounds != null &&
                    this.upperBounds.equals(type.upperBounds)));
    }