code: public boolean abuts(ChronoInterval<T> other) {
  
          if (this.isEmpty() || other.isEmpty()) {
              return false;
          }
  
          T startA = this.getClosedFiniteStart();
          T startB = getClosedFiniteStart(other.getStart(), this.getTimeLine());
          T endA = this.getOpenFiniteEnd();
          T endB = getOpenFiniteEnd(other.getEnd(), this.getTimeLine());
  
          if ((endA == null) || (startB == null)) {
              return ((startA != null) && (endB != null) && startA.isSimultaneous(endB));
          } else if ((startA == null) || (endB == null)) {
              return endA.isSimultaneous(startB);
          }
  
          return (endA.isSimultaneous(startB) ^ startA.isSimultaneous(endB));
  
      }
docs: /*[deutsch]
  <p>Ermittelt, ob dieses Intervall das angegebene Intervall so ber&uuml;hrt, da&szlig;
  weder eine &Uuml;berlappung noch eine L&uuml;cke dazwischen existieren. </p>
  
  <p>&Auml;quivalent zum Ausdruck {@code this.meets(other) || this.metBy(other)}. Leere Intervalle
  ber&uuml;hren sich nie. </p>
  
  @param   other   another interval which might abut this interval
  @return  {@code true} if there is no intersection and no gap between else {@code false}
  @since   3.19/4.15
  @see     #meets(IsoInterval)
  @see     #metBy(IsoInterval)