public void union(FlowSet<T> otherFlow, FlowSet<T> destFlow) {
    if (sameType(otherFlow) && sameType(destFlow)) {
      ArrayPackedSet<T> other = (ArrayPackedSet<T>) otherFlow;
      ArrayPackedSet<T> dest = (ArrayPackedSet<T>) destFlow;

      if (!(other instanceof ArrayPackedSet) || bits.length != other.bits.length)
        throw new RuntimeException("Incompatible other set for union");

      for (int i = 0; i < bits.length; i++) dest.bits[i] = this.bits[i] | other.bits[i];
    } else super.union(otherFlow, destFlow);
  }