code: public TypeName unbox() {
      if (keyword != null) return this; // Already unboxed.
      if (this.equals(BOXED_VOID)) return VOID;
      if (this.equals(BOXED_BOOLEAN)) return BOOLEAN;
      if (this.equals(BOXED_BYTE)) return BYTE;
      if (this.equals(BOXED_SHORT)) return SHORT;
      if (this.equals(BOXED_INT)) return INT;
      if (this.equals(BOXED_LONG)) return LONG;
      if (this.equals(BOXED_CHAR)) return CHAR;
      if (this.equals(BOXED_FLOAT)) return FLOAT;
      if (this.equals(BOXED_DOUBLE)) return DOUBLE;
      throw new UnsupportedOperationException("cannot unbox " + this);
    }
docs: Returns an unboxed type if this is a boxed primitive type (like {@code int} for {@code
  Integer}) or {@code Void}. Returns this type if it is already unboxed.
  
  @throws UnsupportedOperationException if this type isn't eligible for unboxing.