text: Q:
  
  Errores de compilación en mi programa
  
  Estoy empezando con programación orientada a objetos asi que pueden haber errores de principiante. El problema planteado es el siguiente:
  Se desea realizar un sistema de facturación y para ello se quiere modelar las entidades factura y los items que la componen. Cada item tiene un nombre de producto, un precio unitario y la cantidad que lleva del producto. En la factura se tiene una fecha, un nombre de cliente que puede ser opcional y la lista de items que la componen. Se desea que en factura se disponga de al menos dos operaciones:
  a. agregarItem(String nombreProducto, int cantidad, long precioUnitario) que agrega un item a la factura. Se tiene que tomar en cuenta que si ya existe un item agregado con nombreProducto y mismo precioUnitario no debe agregar una linea nueva si no que debe sumar la nueva cantidad pasada. Ejemplo había comprado 2 x Cocas a $30 y luego se hace un agregar un item de 1 x Coca a $ 30 se identifica el item de Coca y se lo actualiza 3 x Coca a $30.
  b. Long calcularTotal(), indica el total de la factura. En caso de no tener items el total es cero.
  c. void imprimirFactura(), imprime en salida estándar el cabezal de la
  factura, los items y el total de la misma.
  Agregue los constructores get y set que considere necesarios. Cree una clase Principal que tenga un método main que cree una factura, agregue 5 items y imprima su contenido en salida estándar. Notar que se utilizó un long para representar un precio, esto fue explícitamente para simplificar la realidad.
  Y las clases que yo escribí son las siguientes:
  class Item{
  
      private String nombreProducto;
      private long precioUnitario;
      private int cantidad;
  
      public Item(String nombreProducto, long precioUnitario, int cantidad){
          this.nombreProducto = nombreProducto;
          this.precioUnitario = precioUnitario;
          this.cantidad = cantidad;
  
      }
  
      public boolean equals(Object obj) {
          boolean bSalida = false;
  
          if (obj != null) {
  
              if (obj instanceof Item) {
  
                  bSalida = ((Item) obj).getNombreProducto().equals(getNombreProducto());
  
              }
  
          }
  
          return bSalida;
      }
  
      public long getPrecioUnitario(){
          return precioUnitario;
      }
  
      public String getNombreProducto(){
          return nombreProducto;
      }
  
      public int getCantidad(){
          return cantidad;
      }
  
      public void setNombreProducto(String nombreProducto){
          this.nombreProducto = nombreProducto;
      }
  
      public void setCantidad(int cantidad){
          this.cantidad = cantidad;
      }
  
      public void setPrecioUnitario(long precioUnitario){
          this.precioUnitario = precioUnitario;
      }
  
  }
  
  class Factura{
  
      private static final int MAX_ITEMS = 100;
  
      private String fecha;
      private String nombreCliente;
      private Item[] items;
      private int cantItems;
  
      public Factura(String fecha, String nombreCliente){
  
          this.fecha = fecha;
          this.nombreCliente = nombreCliente; 
          items = new Item[Factura.MAX_ITEMS];
          cantItems = 0;
      }
  
      public void agregarItem(String nombreProducto, int cantidad, long precioUnitario){
  
          for (int i = 0; i < items.length; i++) {
              if((items[i].getNombreProducto()).equals(nombreProducto)&&(items[i].getPrecioUnitario()) == (precioUnitario)){
  
                  items[i].setCantidad((items[i].getCantidad())++);
              }
              else{
  
                  items[cantItems] = Item(nombreProducto, precioUnitario, cantidad);
                  cantItems++;
              }
          }
  
      }
  
      public long calcularToltal(){
  
          for (int i = 0; i < items.length; i++){
  
              long total = ((items[i].getPrecioUnitario())*(items[i].getCantidad()));
          }
      }
  
      public void imprimir(){
          System.out.println("Supermercado El Dorado");
          System.out.println("Fecha: " + fecha);
          System.out.println("Cliente: " + nombreCliente);
          System.out.println("\t" + "Producto" + "\t" + "Precio" + "\t" + "Cantidad");
          for(int i = 0; i < items.length; i++){
              System.out.println(getItems()[i].getCantidad() + "\t" + getItems()[i].getNombreProducto() + "\t" + getItems()[i].getPrecioUnitario());
          }
          System.out.println("Total: $" + calcularToltal());
          System.out.println("Gracias por preferirnos.");
      }
  
      public Item[] getItems(){
          return items;
      } 
  
  }
  
  Y los errores de compilacion son los siguientes:
  Factura.java:23: error: unexpected type
                                  items[i].setCantidad((items[i].getCantidad())++);
                                                                            ^
    required: variable
    found:    value
  Factura.java:27: error: cannot find symbol
                                  items[cantItems] = Item(nombreProducto, precioUnitario, cantidad);
                                                     ^
    symbol:   method Item(String,long,int)
    location: class Factura
  2 errors
  
  A:
  
  El primer error no es obvio, pero se reduce a que no puedes incrementar algo que no sea una variable. La sentencia
  i++;
  
  es equivalente a
  i=i+1;
  
  Por tanto, si lo que haces es
  item.getCantidad()++;
  
  el compilador lo interpreta como 
  item.getCantidad() =  item.getCantidad() + 1;
  
  Que, obviamente (una vez expuesto así), sabemos que no funcionará; la solución es escribir esa línea así:
  items[i].setCantidad(items[i].getCantidad() + 1);
  
  Además, ten cuidado con el uso de ++, porque
  int i=0;
  item.setCantidad(i++);
  
  es equivalente a
  int i=0;
  item.setCantidad(i); // ¡i es 0 cuando se asigna!
  i=i+1;
  
  Tendrías que poner:
  int i=0;
  item.setCantidad(++i);
  
  que es equivalente a:
  int i=0;
  i=i+1;
  item.setCantidad(i); // i es 1 al asignarlo
  
  El segundo error es más sencillo: se te ha olvidado añadir un "new" delante del contructor Item
  
  