Range(final Optional<Bound<T>> lowerBound, final Optional<Bound<T>> upperBound) { this.lowerBound = lowerBound; this.upperBound = upperBound; if (hasInvertedBounds()) { throw new InvertedBoundsException(this); } if (hasSameExclusiveBounds()) { throw new SameExclusiveBoundsException(this); } }