Foro de elhacker.net

Programación => Java => Mensaje iniciado por: juligarc10 en 13 Marzo 2019, 19:21 pm



Título: incomparable types: contrato[] and contrato
Publicado por: juligarc10 en 13 Marzo 2019, 19:21 pm
Hola amigos,

Tengo un problema, ya que estoy intentando mostrar una serie de objetos los cuales tienen su propio toString(), pero basándome en una condición de estos, dependiendo de si tienen un tipo determinado de un enumerado.
Al hacer la comparación con un if, me da error, y me muestra incomparable types: contrato[] and contrato. Aquí les dejo el código.

Código:
package bloque1_2;
import java.util.Scanner;
/**
 *
 * @author Admin
 */
public class Empresa {
    private Empleado[] empleados;
    private int numEmpleados;
   
    public Empresa(int maxEmpleados){
        empleados=new Empleado [maxEmpleados];
        numEmpleados=0;
                }
    @Override
    public String toString(){
        Scanner entrada=new Scanner(System.in);
        Empleado.Contrato contrato= Empleado.Contrato.FORMACION;
        for(int i=0;i<Empleado.Contrato.values().length;i++){
            System.out.println("Introduzca "+i+" si quiere mostrar los empleados de tipo "+ Empleado.Contrato.values()[i]);
        }
        int opcion=Integer.parseInt(entrada.nextLine());
        contrato=Empleado.Contrato.values()[opcion];
        for (int j=0;j<numEmpleados;j++){
            if(empleados[j].Contrato.values()==contrato){
               
           
            }
        }
    }
}

Este último if es el que me da error.

Gracias de antemano y un saludo.


Título: Re: incomparable types: contrato[] and contrato
Publicado por: rub'n en 13 Marzo 2019, 20:43 pm
Postea los enum aquí a ver cómo los tienes.


Título: Re: incomparable types: contrato[] and contrato
Publicado por: juligarc10 en 13 Marzo 2019, 20:45 pm
Aquí los dejo amigo. Gracias.


Código:
package bloque1_2;

/**
 *
 * @author Admin
 */
public class Empleado {
   
    public static enum Contrato{INDEFINIDO, TEMPORAL, FORMACION, PRACTICAS};
    private int dni;
    private String nombre;
    private int salario;
    private Contrato contrato;
   
    public Empleado(int documento, String name, int dinero, Contrato contrato){
        dni=documento;
        nombre=name;
        salario=dinero;
        this.contrato=contrato;
    }
   
    public int getDni(){
        return dni;
    }
   
    public void setDni(int documento){
        dni=documento;
    }

    public String getNombre() {
        return nombre;
    }

    public int getSalario() {
        return salario;
    }

    public Contrato getContrato() {
        return contrato;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setSalario(int salario) {
        this.salario = salario;
    }

    public void setContrato(Contrato contrato) {
        this.contrato = contrato;
    }
   
    public String toString(){
        StringBuilder toret=new StringBuilder();
        toret.append("/nEl nombre del empleado es ").append(nombre)
                .append("/n El dni del empleado es ").append(dni)
                .append("/n Su salario es ").append(salario)
                .append("/n Su tipo de contrato es ").append(contrato);
        return toret.toString();
    }
   
}


Título: Re: incomparable types: contrato[] and contrato
Publicado por: juligarc10 en 13 Marzo 2019, 20:46 pm
Postea los enum aquí a ver cómo los tienes.
Hecho.


Título: Re: incomparable types: contrato[] and contrato
Publicado por: rub'n en 13 Marzo 2019, 20:48 pm
Cuando llegue a la guarida, te ayudo dog, ese enum Contrato es mejor desarrollarlode otra manera, con un método estático dentro que consulte, si posee esa constante o no, logrando mayor legibilidad, que como lo estás haciendo , es un mero desastre  >:D


Título: Re: incomparable types: contrato[] and contrato
Publicado por: spcruzaley en 13 Marzo 2019, 22:50 pm
Que tal Rub'n

Antes de nada, veo que tu variable numEmpleados la seteas a cero, imagino que solo es para pruebas o en alguna otra parte seteas algun valor, cierto? porque de otra manera nunca entrara a tu for.

Por otra parte, como bien comenta juligarc10, ese enum puede tener una mayor legibilidad si generas un metodo que se encargue de hacer algo mas especifico, igual por lo pronto podrias cambiar el for por esto:

Código
  1.        for (Empleado.Contrato ctr : Empleado.Contrato.values()) {
  2.            if (ctr.equals(contrato)) {
  3.                 //Do something
  4.            }
  5.        }
  6.  


Saludos.
SPCruzaley


Título: Re: incomparable types: contrato[] and contrato
Publicado por: rub'n en 13 Marzo 2019, 23:39 pm
spcruzaley tal cual dog, por ahí iba la cosa saludos.

Código
  1. public enum Contrato {
  2.  
  3.    INDEFINIDO("indefinido"),
  4.    TEMPORAL("temporal"),
  5.    FORMACION("formacion"),
  6.    PRACTICAS("practicas");
  7.  
  8.    private final String value;
  9.  
  10.    Contrato(final String value) {
  11.        this.value = value;
  12.    }
  13.  
  14.    public String getValue() {
  15.        return value;
  16.    }
  17.  
  18.    public static Contrato getContrato(final String tipoContrato) {
  19.        Contrato contrato = null;
  20.        for(final Contrato tmp : Contrato.values()) {
  21.            /**
  22.              * a lowercase para coincidir con las constantes
  23.              */
  24.            if(tmp.getValue().equals(tipoContrato.toLowerCase())) {
  25.                contrato = tmp;
  26.                break;// se sale de las iteracioes con la primera coincidencia
  27.            }
  28.        }
  29.        return contrato;
  30.    }
  31. }
  32.  

Código
  1. /**
  2.  *
  3.  */
  4. public class Empresa {
  5.  
  6.    private static final Logger LOGGER = Logger.getLogger(Empresa.class.getSimpleName());
  7.    private static final Scanner LEER = new Scanner(System.in);
  8.    private String tipo;
  9.  
  10.    public Empresa() {
  11.        try {
  12.            LOGGER.info("Introduce Tipo de contrato :D");
  13.            this.tipo = LEER.nextLine();
  14.            final Contrato contrato = Contrato.getContrato(tipo);
  15.            switch (contrato) {
  16.                case TEMPORAL:
  17.                    LOGGER.info("Temporal");
  18.                    break;
  19.                case FORMACION:
  20.                    LOGGER.info("Formacion");
  21.                    break;
  22.                case PRACTICAS:
  23.                    LOGGER.info("Practicas");
  24.                    break;
  25.                case INDEFINIDO:
  26.                    LOGGER.info("Indefinido");
  27.                    break;
  28.            }
  29.        } catch (final NullPointerException ex) {
  30.            LOGGER.severe("No existe " + this.tipo);
  31.        }
  32.  
  33.    }
  34.  
  35.    @Override
  36.    public String toString() {
  37.        return "Lo que quieres hacer aqui esta medio bull$shit, pero si quieres explicate mejor XD";
  38.    }
  39.  
  40.    public static void main(String... blalb) {
  41.        new Empresa();
  42.    }
  43. }


Título: Re: incomparable types: contrato[] and contrato
Publicado por: WHK en 14 Marzo 2019, 02:42 am
Tienes una excepción al intentar utilizar un índice inexistente:

Código:
for (int j=0;j<numEmpleados;j++){
            if(empleados[j].Contrato.values()==contrato){
                
            
            }
        }

Si la cantidad de empleados es 0, entonces no puedes ir a buscar el índice cero porque no existe. Hay que añadir un -1 a numEmpleados y hacer una condicional que diga que si la cantidad es mayor que cero entonces ir a hacer el recorrido del for.

También te recomiendo utilizar una lista en ves de un array ya que Java lo maneja de mejor manera, de hecho los repositorios Crud utilizan listas en ves de arrays, puedes llamar funciones para validar si estan vacias, obtener y buscar índices, etc.

Saludos.